broadcastreceiver - 在应用程序类上使用 registerReceiver 是一种好的、已知的做法吗?

标签 broadcastreceiver android

背景

在 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/在 ma​​nifest 中: 每次对应事件到来时都会触发接收者的处理程序。示例:每当您连接互联网以向您显示您的通知时,facebook 的信使就会被午餐...或者当您连接以提出更新时,其他应用程序会被午餐... 换句话说,接收者总是被注册的。

2/在 serviceactivityapplication 中: 当注册的上下文被杀死时,接收者将被取消注册。 换句话说,它完全取决于它被注册的上下文,你有义务在代码中的某个地方取消注册它。示例:一个 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/

相关文章:

android - Cordova android 插件调试

java - 当手机处于深度 sleep 时接收音量键按下事件

android - 如何从命令行发送带权限的广播

Android 在应用程序被杀死时重新安排 alarmmanager 警报

android - 如何确保在 Android N 及更高版本上的设备重启时调用 PeriodicWorkRequest

Android 短信发送失败通知 : false positive

android - 让 Android 应用程序出现在默认应用程序列表中?

android - 不从 AlarmManager 调用 BroadcastReceiver

android - 是否有用于从 PostgreSQL 数据库呈现 OpenStreetMap 数据的 API?

android - 无法使用 Appium 移动 Android SeekBar