我正在使用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>
答案 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