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