9

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

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

以 Android O 为目标的应用无法再在其清单中为隐式广播注册广播接收器。隐式广播是不专门针对该应用程序的广播。

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

4

1 回答 1

8

假设我创建了一个BroadcastReceiverforBOOT_COMPLETEDcontext.registerReceiver从中调用并且从不调用unregisterReceiver此接收器是否也永远存在(直到手机重新启动)?

首先,BOOT_COMPLETED其中一个动作,仍然会像以前一样表现,这意味着“O”中引入的限制与该动作无关。

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

那么在广播BroadcastReceiver之后注册的 a是否与通过清单自动注册的aBOOT_COMPLETED具有相同的生命周期(一直到下一次重新启动) ?BroadcastReceiver

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

Nasir Khan 的这个短片会很有帮助。

于 2017-03-30T18:10:57.197 回答