0

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

问题是当屏幕关闭并且活动不在前台时,事件不会被捕获,因为接收器未注册。如何在保持广播接收器的注册/注销一致性的同时在后台捕获所有事件?

4

3 回答 3

2

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

以下是一些起点:

  • 您的服务onStartCommand()应该return START_STICKY,所以它不会被操作系统杀死。
  • 您应该在 Service 中创建一个本地变量来保存您的广播接收器,并将此接收器注册到onStart()并取消注册onDestroy()
  • 只要你觉得合适就启动服务(例如onCreate()应用程序,因为它在每个应用程序生命周期只被调用一次,并且不依赖于特定的活动)。

这个答案可能会有所帮助。

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

于 2016-01-08T12:15:51.330 回答
1

有两种选择

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

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

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

于 2016-01-08T12:07:26.837 回答
0

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

此外,我将WeakReference视图用于我的视图,它允许检查是否已经处理了活动以防止意外错误。

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

于 2016-01-08T17:02:50.797 回答