2

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

要注册广播接收器以收听从后台活动发送的广播,我在主线程活动中使用以下代码:

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

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

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

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

4

1 回答 1

2

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

为了从服务向前台活动报告状态我的偏好是ResultReceiver( 2 ) 与广播相比感觉自然的类。此外,如果您需要返回多个状态消息,使用ResultReceiver 类statusCode的方法中的参数会更清楚。onReceiveResult

于 2015-05-24T14:24:55.903 回答