避免在Android

时间:2015-05-23 15:25:20

标签: android multithreading android-intent broadcastreceiver localbroadcastmanager

我正在尝试创建我的第一个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布尔值,但我有这种唠叨的感觉,我大量过度复杂化了。我错过了什么?感谢您提供的任何帮助!!

1 个答案:

答案 0 :(得分:2)

要回答您的问题,您可以忽略sharedprefs并在onResume中注册广播接收器,并在onPause中取消注册接收器。报告工作状态(1)android doc中详细描述了此方法。请注意,这样,只有当Activity位于前台时,才会获得状态更新。根据您的需要使用适当的生命周期方法。

要将状态报告回来自服务的前景活动,我的偏好将是ResultReceiver2)类,与广播相比感觉自然。此外,如果您需要返回多个状态消息,那么使用ResultReceiver类的statusCode方法中的onReceiveResult param将更加清楚。