我有一个应用程序,可以从各个地方(应用程序活动和后台服务)发出异步HTTP请求。我想在主要活动中捕获响应事件并修改一些视图。这是通过在主活动中使用匿名类BroadcastReceiver来实现的。注册/取消注册广播接收器在onResume()
/ onPause()
内。
问题在于,当屏幕关闭且活动不在前台时,事件未被捕获,因为接收器未注册。如何在保留BroadcastReceiver的注册/注册一致性的同时捕获所有事件甚至在后台?
答案 0 :(得分:2)
这里最好的选择是启动持久的后台服务(使用本地广播接收器)。
以下是一些起点:
onStartCommand()
应该return START_STICKY
,所以
它没有被操作系统杀死。onStart()
中的接收者,并在onDestroy()
中取消注册。onCreate()
应用程序,因为它每个应用程序生命周期只调用一次
并且与特定活动无关。)这answer可能会有所帮助。
您现有的方法不起作用,因为当屏幕关闭时,onPause信号会发送到您的所有活动,并自动取消注册本地广播接收器(它们应该是)。
答案 1 :(得分:1)
有两种选择
运行服务并在那里注册接收器。
您可以在清单中注册广播接收器并在那里处理它。请记住,接收器将在主线程上运行,因此您应该向正在运行的服务发出信号,或许是执行单个任务的服务。
可以使用IntentService实施执行单个任务的服务。它有点像服务中包含的异步任务。
答案 2 :(得分:0)
我通过添加EventBus lib解决了这个问题。处理程序在主要活动中实现,活动为onCreate()
上的事件订阅并在onDestroy()
上取消订阅。由于EventBus lib是基于标准Java组件构建的,因此我希望垃圾收集器能够自动清理所有内容,即使未调用onDestroy()
也是如此。
此外,我使用WeakReference
作为我的观点,可以检查是否已经处置了一项活动以防止意外错误。
这可能不是最佳解决方案,但它现在可以使用,并且比其他提议的答案更容易实现。