我需要给这个应用程序实现一个功能,它由一个在后台工作的 Service
和一个 Activity
组成(它实现了 Service
而不是 IntentService
)。
我查看了一些互联网上的教程,它们都使用 LocalBroadcastManager
,顺便说一下,这也是 Android 推荐的方法:
如果您不需要跨应用发送广播,请考虑使用此类与
LocalBroadcastManager
代替下面描述的更通用的方式。
我花了一整天的时间找出问题所在:只有当我使用 Context.sendBroadcast()
和 Context.registerReceiver()
而不是 LocalBroadcastManager
的方法时,它才能正常工作。
现在我的应用程序正在工作,但我感觉我违背了最佳实践,而且我不知道为什么。 有没有什么想法,为什么会发生这种情况?
编辑:
在我写完这个问题后,我进一步研究了这个问题。 LocalBroadcastManager
是通过一个单例模式工作的,我们应该调用 LocalBroadcastManager.getInstance(this).method()
。我记录了两个实例(在 Activity
和 Service
中),它们具有不同的内存地址。
现在我又有一个问题,一个 Service
不应该拥有调用它的 Activity
相同的 Context
吗?根据这篇文章,一个 Service 运行在主线程上,因此我认为 Context 应该是相同的。
对此有什么想法吗?(抱歉,帖子有点长)
代码示例:
MyService
public class MyService extends Service {
...
// When an event is triggered, sends a broadcast
Intent myIntent = new Intent(MainActivity.MY_INTENT);
myIntent.putExtra("myMsg","msg");
sendBroadcast(myIntent);
// Previously I was trying:
// LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(myIntent);
}
我的活动
public class MainActivity {
...
private BroadcastReceiver messageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("onReceive", "received!");
// TODO something
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(messageReceiver, new IntentFilter(MY_INTENT));
// Previously I was trying:
// LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(messageReceiver, new IntentFilter(MY_INTENT));
}
}