避免在 Android 中注册重复的广播接收器

Avoid registering duplicate broadcast receivers in Android

我正在尝试创建我的第一个 Android 应用程序。我想要一个主线程 Activity(在我的例子中:ActionBarActivity)从后台接收事件通知 Activity(在我的例子中:IntentService)。我读过使用广播应该是最好的方法。

为了注册一个广播接收器来监听从后台发送的广播activity,我在主线程中使用了以下代码activity:

// Register broadcast receiver
LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.me.myBroadcast");
bManager.registerReceiver(bReceiver, intentFilter);

我尝试将其放入主线程 activity 的 onCreate() 方法中,但我很快发现每次重新启动 activity(例如关闭应用程序并重新打开它),它似乎创建了 "duplicate" 广播接收器,然后只要发送单个广播,它就会多次触发广播接收器的 onReceive() 方法。这导致了问题。

所以我创建了一个 SharedPreferences 文件来保存一个布尔值,它会记住我是否已经创建了一个广播接收器,以避免创建重复项。这完全符合预期,当然,直到我重新启动设备,之后广播接收器被销毁,应用程序不会创建一个新的,因为 SharedPreferences 布尔值说它已经有一个。

我想我可以通过设置一个新的广播接收器来侦听设备重启来解决这个问题,这会重置 SharedPreferences 布尔值,但我有一种挥之不去的感觉,我让事情变得过于复杂了。我错过了什么?感谢您提供的任何帮助!!

要回答您的问题,您可以忽略 sharedprefs 并在 onResume 中注册广播接收器并在 onPause 中注销接收器。 Reporting Work Status(1) android 文档中详细描述了此方法。请注意,通过这种方式,只有当 Activity 处于前台时,您才会获得状态更新。根据您的需要使用适当的生命周期方法。

要从服务向 前台 activity 报告状态,我的偏好是 ResultReceiver(2) class 比起广播感觉自然。此外,如果您需要返回多个状态消息,在 ResultReceiver class.

onReceiveResult 方法中使用 statusCode 参数会更清楚