BroadcastReceiver 在整个 activity 生命周期中持续存在
BroadcastReceiver persistent during the whole activity lifecycle
我有一个应用程序可以从不同的地方(应用程序活动和后台服务)发出异步 HTTP 请求。我想在我的主 activity 中捕获响应事件并修改一些视图。这是通过在主 activity 中使用匿名 class BroadcastReceiver 来实现的。广播接收器的registering/unregistering在onResume()
/onPause()
里面。
问题是,当屏幕关闭且 activity 不在前台时,事件不会被捕获,因为接收器未注册。如何在保持 BroadcastReceiver 的 register/unregister 一致性的同时捕获所有事件甚至在后台?
有两种选择
有一个服务 运行ning 并在那里注册接收器。
您可以在清单中注册广播接收器并在那里进行处理。请记住,接收器将 运行 在主线程上,因此您应该向 运行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 是否已被处置以防止意外错误。
这可能不是最好的解决方案,但它目前有效,并且比其他建议的答案更容易实施。
我有一个应用程序可以从不同的地方(应用程序活动和后台服务)发出异步 HTTP 请求。我想在我的主 activity 中捕获响应事件并修改一些视图。这是通过在主 activity 中使用匿名 class BroadcastReceiver 来实现的。广播接收器的registering/unregistering在onResume()
/onPause()
里面。
问题是,当屏幕关闭且 activity 不在前台时,事件不会被捕获,因为接收器未注册。如何在保持 BroadcastReceiver 的 register/unregister 一致性的同时捕获所有事件甚至在后台?
有两种选择
有一个服务 运行ning 并在那里注册接收器。
您可以在清单中注册广播接收器并在那里进行处理。请记住,接收器将 运行 在主线程上,因此您应该向 运行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 是否已被处置以防止意外错误。
这可能不是最好的解决方案,但它目前有效,并且比其他建议的答案更容易实施。