如果我通过mainfest文件声明BroadcastReceiver
进行系统广播(比如说ACTION_POWER_DISCONNECTED
),系统会在每次发送特定广播时调用它,以便BroadcastReceiver的生命周期不受限制。
但也有广播无法通过清单文件注册。对于这些广播,我们必须使用相应的context.registerReceiver
来呼叫IntentFilter
。我们假设我为BOOT_COMPLETED
创建了一个BroadcastReceiver并从中调用了context.registerReceiver
并且从不致电unregisterReceiver
此接收器是否也永远存在(直到手机重启)?
针对Android O的应用无法再在其清单中为隐式广播注册广播接收器。隐式广播是一种不专门针对该应用的广播。
如果我的猜想是正确的,这将是一个简单的系统更改解决方法(当然你不应该这样做,但它是可能的)。那么BroadcastReceiver
广播之后注册的BOOT_COMPLETED
具有相同的生命周期(保持到下一次重启)作为通过清单自动注册的BroadcastReceiver吗?
答案 0 :(得分:8)
我们说我为
BroadcastReceiver
创建BOOT_COMPLETED
并从中context.registerReceiver
拨打电话unregisterReceiver
并且永远不会致电BOOT_COMPLETED
此接收器是否永远存在(直到电话重新启动)?
首先,BroadcastReceiver
是one of those actions,它仍然会像以前一样表现出来,这意味着在" O"不关心那个行动。
一旦您的应用程序被系统杀死,或者系统一旦清除了应用程序的内存(由于设备内存不足),您的广播注册就会丢失。否则我无法看到这种限制将如何带来更好的电池体验。
在
BOOT_COMPLETED
广播之后注册的BroadcastReceiver
具有相同的生命周期(保持到下一次重启)作为Select t1.Trasaction_ID as ID1 ,t2.Transaction_ID as ID2 ,t1.Company ,t1.Transaction_Date ,t1.Transaction_Type ,t1.Price as Price1 ,t2.Price as Price2 From transactions t1 inner join transactions t2 on t1.Company = t2.Company and t1.Transaction_Date = t2.Transaction_Date and t1.Transaction_Type = t2.Transaction_Type where ABS(t1.Price - t2.Price) > (t1.Price * 0.0025)
并通过清单自动注册吗?
如果上述情况未得到满足,即您的应用程序处于活动状态且应用程序因内存不足而无法从内存中清除 - 那么是。一旦进入cached state(没有活动Android组件的州),注册将再次丢失。
此short video by Nasir Khan会有所帮助。