关于 Android O 更改的 BroadcastReceiver 的生命周期

Lifetime of BroadcastReceiver with regard to Android O changes

如果我通过 mainfest 文件声明一个 BroadcastReceiver 用于系统广播(例如 ACTION_POWER_DISCONNECTED),系统将在每次发送特定广播时调用它,因此BroadcastReceiver 不受限制。

但也有无法通过清单文件注册的广播。对于这些广播,我们必须用相应的 IntentFilter 调用 context.registerReceiver。假设我为 BOOT_COMPLETED 创建了一个 BroadcastReceiver 并从中调用 context.registerReceiver 而从不调用 unregisterReceiver 这个接收器是否也永远存在(直到 phone 重新启动)?

Apps that target Android O can no longer register broadcast receivers for implicit broadcasts in their manifest. An implicit broadcast is a broadcast that does not target that app specifically.

如果我上面的猜想是正确的,这将是系统更改的简单解决方法(当然你不应该这样做,但这是可能的)。那么在 BOOT_COMPLETED 广播之后注册的 BroadcastReceiver 是否与通过清单自动注册的 BroadcastReceiver 具有相同的生命周期(一直持续到下一次重启)?

Let's say I create a BroadcastReceiver for BOOT_COMPLETED and call context.registerReceiver from it and never call unregisterReceiver does this receiver also lives forever (until the phone is rebooted)?

首先,BOOT_COMPLETEDone of those actions,仍然会像以前一样运行,这意味着 "O" 中引入的限制与该操作无关。

一旦您的应用程序的进程被系统终止或系统清除您的应用程序的内存(由于设备内存不足),您的广播注册将丢失。否则我看不出这个限制如何带来更好的电池体验。

So does a BroadcastReceiver which is registered after a BOOT_COMPLETED broadcast have the same lifetime (stays until the next reboot) as a BroadcastReceiver which is automatically registered via the manifest?

如果不满足上述情况,即您的应用程序的进程保持活动状态并且应用程序由于内存不足而未从内存中清除 - 那么是的。一旦进入cached state(没有活动Android组件的状态),注册将再次丢失。

这个short video by Nasir Khan会有帮助。