【问题标题】:Lifetime of BroadcastReceiver with regard to Android O changesBroadcastReceiver 的生命周期与 Android O 的变化有关
【发布时间】:2017-03-30 17:59:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-intent android-broadcastreceiver android-8.0-oreo


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 请问,如果应用程序在调用 registerReceiver 后没有调用它,自动调用 unregisterReceiver 的谷歌文档在哪里?
    • @user1510006,在文档中找不到这一点,但正如 Khan 先生所说:And you can still register to receive implicit broadcasts while your app is active. 我理解,当应用程序处于缓存状态时,您将不再收到广播。
    猜你喜欢
    • 2011-09-12
    • 2014-05-19
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多