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

标签 android multithreading android-intent broadcastreceiver localbroadcastmanager

我正在尝试创建我的第一个 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 (例如关闭应用程序并重新打开它)时,它似乎都会创建“重复”广播接收器,然后每当发送单个广播时都会多次触发广播接收器的 onReceive() 方法。这会引起问题。

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

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

最佳答案

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

要从服务向前台 Activity 报告状态,我更喜欢使用 ResultReceiver( 2 ) 类,与广播相比,它感觉更自然。另外,如果您需要返回多个状态消息,使用 ResultReceiver 类的 onReceiveResult 方法中的 statusCode 参数会更清晰。

关于android - 避免在 Android 中注册重复的广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414410/

相关文章:

java - Java 中的动态模型

java - Material Components 主题无法正确渲染 TextButton

android - 运行 Android Junit 时找不到测试类异常

multithreading - TBB 在 Matlab Mex 文件中表现奇怪

Android - 如何从 WebView 中显示的环聊 URL 打开环聊应用程序?

android - 尝试使用 Google 电子钱包验证 Android 应用内购买

c# - 是否允许在线程之间缓存/重用 Thread.GetNamedSlot?

java - JEdi​​torPane图片异步下载问题

java - 为什么 apk 不自动安装在三星设备上

android - 如何在没有 Intent 的情况下以编程方式调用电话