BroadcastReceiver在整个活动生命周期中持久化

时间:2016-01-08 11:42:27

标签: android android-broadcastreceiver

我有一个应用程序,可以从各个地方(应用程序活动和后台服务)发出异步HTTP请求。我想在主要活动中捕获响应事件并修改一些视图。这是通过在主活动中使用匿名类BroadcastReceiver来实现的。注册/取消注册广播接收器在onResume() / onPause()内。

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

3 个答案:

答案 0 :(得分:2)

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

以下是一些起点:

  • 您的服务onStartCommand()应该return START_STICKY,所以 它没有被操作系统杀死。
  • 你应该在里面创建一个局部变量 保存您的广播接收器并注册此服务的服务 onStart()中的接收者,并在onDestroy()中取消注册。
  • 开始 只要您找到合适的服务(例如onCreate() 应用程序,因为它每个应用程序生命周期只调用一次 并且与特定活动无关。)

answer可能会有所帮助。

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

答案 1 :(得分:1)

有两种选择

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

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

  3. 可以使用IntentService实施执行单个任务的服务。它有点像服务中包含的异步任务。

答案 2 :(得分:0)

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

此外,我使用WeakReference作为我的观点,可以检查是否已经处置了一项活动以防止意外错误。

这可能不是最佳解决方案,但它现在可以使用,并且比其他提议的答案更容易实现。