LocalBroadcastManager.sendBroadcast不触发BroadcastReceiver onReceive

时间:2015-11-09 21:30:49

标签: android

我正在使用LocalBroadcastReceiver将消息从IntentService发送到活动。我有一个基本活动,我项目中的所有活动都包含下面的活动代码。一个基本的IntentService,由WakefulBroadcastReceiver初始化,包含下面的服务代码。

在我的活动中,我有:

@Override
protected void onCreate(Bundle savedInstanceState) {

    LocalBroadcastManager.getInstance(this).registerReceiver(
            mMessageReceiver, new IntentFilter("push-message"));
    super.onCreate(savedInstanceState);
}
 @Override
protected void onPause(){
    LocalBroadcastManager.getInstance(this).unregisterReceiver(
            mMessageReceiver);
    super.onPause();
}
@Override
protected void onResume(){
    super.onResume();
    LocalBroadcastManager.getInstance(this).registerReceiver(
            mMessageReceiver, new IntentFilter("push-message"));
}
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = intent.getStringExtra("message");
        Log.d("receiver", "Got message: " + message);
    }
};

在我的服务中,我有:

public class SimpleMessagerService extends IntentService {
public SimpleMessagerService() {
    super("SimpleMessagerService");
}
@Override
protected void onHandleIntent(Intent intent) {
    Intent newintent = new Intent("push-message");
    // You can also include some extra data.
    String message = intent.getExtras().getString("message");
    newintent.putExtra("message", message);


    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}

正在触发服务onHandleIntent,当我在其中放入一个断点并计算表达式时:LocalBroadcastManager.getInstance(this);我可以在mReceivers列表中看到mMessageReceiver;但是当我在mMessageReceiver的onReceive中放置一个断点时,我发现它永远不会被触发。

更多信息: 看来我的服务在调用时不能主动执行任何操作,但不会抛出异常。我尝试将当前上下文保存在应用程序文件中,并从服务中抛出一个Toast消息。这个过程似乎成功了,但是toast的消息永远不会出现。这就是我在服务清单中的含义:

<service
        android:name="packagename.services.SimpleMessagerService"
        android:exported="false">
</service>

1 个答案:

答案 0 :(得分:0)

发现了一些错误的事情。首先导出需要在清单中为真。其次,因为服务是一个Intent服务,它在与主要活动不同的线程中运行,所以为了向他们发送广播,我必须使它看起来像:

Handler mHandler = new Handler(getMainLooper());
        mHandler.post(new Runnable() {
             @Override
             public void run() {
                  Intent newintent = new Intent("push-message");
                  newintent.putExtra("message", message);
                  LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(newintent);
             }
         });

所以主要线程被击中了。我希望这可以帮助其他人解决同样的问题。 我想将rubenlop88归功于在线程中针对类似问题发布此解决方案, java.lang.RuntimeException: Handler (android.os.Handler) sending message to a Handler on a dead thread