Android:从 BroadcastReceiver 事件发送 LocalBroadcastManager 的意图

Posted

技术标签:

【中文标题】Android:从 BroadcastReceiver 事件发送 LocalBroadcastManager 的意图【英文标题】:Android: sending LocalBroadcastManager's intents from BroadcastReceiver events 【发布时间】:2014-01-10 04:22:00 【问题描述】:

我遇到了一种奇怪的情况,即从服务或 MainActivity 向 LocalBroadcastManager 注册了一个意图接收器,而当从 PHONE_STATE 接收器(在 androidManifest.xml 中定义)发送意图时,它从未被接收到。

从活动|服务发送相同意图的“自我测试” - 有效。

是否值得尝试指定通过 AndroidManifest.xml 接收 LocalBroadcastManager 的意图?


服务定义为:

    <service
     android:name=".AppService"
     android:process=":remote">
      <intent-filter>
       <action android:name="me.cmp.app.AppService" />
      </intent-filter>
    </service>

在役:

 public class AppService extends Service 
 @Override
 public void onCreate() 
        super.onCreate();
        LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("me.cmp.app.statechange"));

            // self-test uses same intent sending code:
            Intent intent2 = new Intent("me.cmp.app.statechange");
            intent2.putExtra("message", "selfsend");
            LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent2);

   
 ...

在清单中:

    <receiver android:name="me.cmp.app.PhoneReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>        

听众:

public class PhoneReceiver extends BroadcastReceiver 

  @Override
  public void onReceive(Context context, Intent intent) 
    Bundle extras = intent.getExtras();
    if (extras != null) 
      Log.e("test", extras.getString(TelephonyManager.EXTRA_STATE));

      Intent intent2 = new Intent("me.cmp.app.statechange");
      intent2.putExtra("message", state.toString());
      LocalBroadcastManager.getInstance(context).sendBroadcastSync(intent2);
      Log.w("test", "Broadcast sent");
    
  

--

主要问题似乎是 Should I use android: process =":remote" in my receiver? ; 但是我仍然不确定为什么 MainActivity 的接收器没有更早地工作,也许完全限定名称是必须的

【问题讨论】:

发布每次广播发送的代码。 当前代码不起作用(因此,完全限定的意图名称或 sendBroadcastSync 都没有太大帮助。 我看到的差异是您的服务是App,而清单有AppService。我会确保该服务正在运行,但我会拿出 android:process=":remote" 看看它是否有任何作用。 @A--c App/Appservice 是一个错字;删除 android:process=":remote" 有效,你能把它作为答案吗? 我看到了你的编辑,MainActivity's receiver didn't worked earlier? 是什么意思如果服务是唯一的 remote,那么LocalBroadcasts 将无法按预期工作是有道理的跨度> 【参考方案1】:

LocalBroadcastReceiver 文档声明它是一个

帮助注册并向本地对象发送 Intent 广播 在您的流程中

这意味着如果您正在使用在单独进程中运行的服务(例如android:process=":remote"),LocalBroadcastManager 很可能会失败(尽管是静默),因为您可能会获得此类的两个单独实例(一个每个进程)。

【讨论】:

以上是关于Android:从 BroadcastReceiver 事件发送 LocalBroadcastManager 的意图的主要内容,如果未能解决你的问题,请参考以下文章

小部件不更新视图并且也没有显示错误

浅谈ANR及如何分析解决ANR

浅谈ANR及如何分析解决ANR

如何从 Android 版本 Marshmallow 开始请求从 Android 拨打电话的权限?

从0到1实现一个Android路由——APT收集路由

从0到1实现一个Android路由——初探路由