背景
在 Android 上,有两种方法可以通过 BroadcastReceivers 监听系统事件:
- 静态地,通过 list
- 以编程方式,通过代码。
由于某些项目包含大量 Activity 、服务和“管理器”类,因此使用单个 BroadcastReceiver 通知应用程序上的所有监听器发生的事情可能会很有用,而不是使用多个 BroadcastReceiver正在使用(及其代码处理)。
这种广播接收器的一个例子是监听连接变化的那个:
@Override
public void onCreate() {
super.onCreate();
...
registerReceiver(new ConnectivityChangedBroadcastReceiver(), new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION));
...
}
问题
目的是在应用“活着”(通过服务和/或 Activity )时监听事件。
使用 list 会错过这个目的,因为它会在每次事件发生时唤醒应用程序,即使应用程序不需要它。
问题是,取消注册不会发生,并且可能会导致操作系统因此而以不同的方式对待应用程序。
在从 Application 扩展的类上调用“registerReceiver”是一种众所周知的做法吗?
使用时有什么副作用和注意事项吗?
有没有其他选择?
我只是想确保它可以安全使用。
最佳答案
我们无法真正知道什么对您有好处或更好。
建议大家多了解一下接收方注册方式的区别:
1/在 manifest 中: 每次对应事件到来时都会触发接收者的处理程序。示例:每当您连接互联网以向您显示您的通知时,facebook 的信使就会被午餐...或者当您连接以提出更新时,其他应用程序会被午餐... 换句话说,接收者总是被注册的。
2/在 service 或 activity 或 application 中:
当注册的上下文被杀死时,接收者将被取消注册。
换句话说,它完全取决于它被注册的上下文,你有义务在代码中的某个地方取消注册它。示例:一个 Activity 正在等待服务(正在后台执行某些操作)发送警报以更新某些内容,然后您可以在 onResume()
中注册接收器并在您的 中取消注册它>onPause()
.
结论:只取决于接收器的生命周期要求。
另见 Broadcast Receiver Register in Manifest vs. Activity
Main difference between Manifest and Programmatic registering of BroadcastReceiver
关于broadcastreceiver - 在应用程序类上使用 registerReceiver 是一种好的、已知的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239797/