我遇到一种奇怪的情况,即从服务或MainActivity向LocalBroadcastManager注册一个intent接收器,当从PHONE_STATE接收器发送intent(在AndroidManifest.xml中定义)时,它从未收到过。
从activity | service发送相同意图的“自我测试” - 工作。
是否值得尝试指定通过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的接收器没有提前工作,也许完全合格的名字是必须的。
答案 0 :(得分:11)
LocalBroadcastReceiver
文档声明它是
帮助注册并向本地对象发送Intent广播 在你的过程中
这意味着如果您正在使用在单独进程中运行的服务(例如android:process=":remote"
),LocalBroadcastManager
很可能会失败(尽管是静默的),因为您可能正在获取两个单独的实例这个类(每个进程一个)。