BroadcastReceiver 在整个 activity 生命周期中持续存在

BroadcastReceiver persistent during the whole activity lifecycle

我有一个应用程序可以从不同的地方(应用程序活动和后台服务)发出异步 HTTP 请求。我想在我的主 activity 中捕获响应事件并修改一些视图。这是通过在主 activity 中使用匿名 class BroadcastReceiver 来实现的。广播接收器的registering/unregistering在onResume()/onPause()里面。

问题是,当屏幕关闭且 activity 不在前台时,事件不会被捕获,因为接收器未注册。如何在保持 BroadcastReceiver 的 register/unregister 一致性的同时捕获所有事件甚至在后台?

有两种选择

  1. 有一个服务 运行ning 并在那里注册接收器。

  2. 您可以在清单中注册广播接收器并在那里进行处理。请记住,接收器将 运行 在主线程上,因此您应该向 运行ning 服务发出信号,也许是执行单个任务的服务。

可以使用 IntentService 实现执行单个任务的服务。它有点像包裹在服务中的异步任务。

你最好的选择是启动一个持久的后台服务(使用本地广播接收器)。

以下是一些起点:

  • 您的服务 onStartCommand() 应该 return START_STICKY,所以 它没有被 OS.
  • 杀死
  • 你应该在里面创建一个局部变量 持有你的广播接收器的服务并注册这个 onStart() 中的接收器并在 onDestroy() 中注销它。
  • 开始 只要您发现合适的服务(例如 onCreate() 应用程序,因为每个应用程序只调用一次 life-cycle 并且不依赖于特定的 Activity).

answer 可能会有所帮助。

您现有的方法不起作用,因为当屏幕关闭时,onPause 信号会发送到您的所有 Activity,它们会自动注销本地广播接收器(它们应该注销)。

我通过添加 EventBus 库解决了这个问题。该处理程序在主 activity 内部实现,activity 订阅 onCreate() 上的事件并取消订阅 onDestroy() 上的事件。由于 EventBus 库是基于标准 Java 组件构建的,我希望垃圾收集器能够自动清理所有内容,即使未调用 onDestroy() 也是如此。

此外,我使用 WeakReference 作为我的视图,它允许检查 activity 是否已被处置以防止意外错误。

这可能不是最好的解决方案,但它目前有效,并且比其他建议的答案更容易实施。