Android O行为变更--隐式广播限制

前言

广播分类:显示和隐式
显示:发送广播时,指定具体的广播接收者类,例如:在Activity中可通过如下语句发送广播:

sendBroadcast(new Intent(this, MyReceiver.class)))。

AndroidMainfest.xml中注册:

<receiver android:name=".MyReceiver"/>

隐式:发送广播时,不指定具体的广播接收者类,而是携带一些action、category或者data。例如:

sendBroadcast(new Intent("com.test.intent.action"));

AndroidMainfest.xml中注册:

    <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="com.test.intent.action" />
            </intent-filter>
    </receiver>

限制

Android O做了一系列变更,在清单文件中注册的隐式广播(除例外情况),运行在Android O上已经不起任何作用(不会收到广播回调)至于为什么要做这一变更,还是为了节省电量,提升续航,增强性能,提高用户体验。

举个例子:现在的手机中少则几十个应用多则上百,如果每个应用都注册监听CONNECIVITY_ACTION广播,想象一下,每当WiFi,数据流量网络状态发生变化时系统就会发出广播,此时所有的应用都被唤醒并执行任务,即使这些应用不在前台甚至没有运行,所以可想这是多么的耗费资源,特别是电量。

例外情况

有几种广播目前不会受这些限制,无论应用目标平台的 API 级别为何,都可以继续注册下列广播的侦听器。
1. ACTION_LOCKED_BOOT_COMPLETED、ACTION_BOOT_COMPLETED:原因:这些广播只在首次启动时发送一次,并且许多应用都需要接收此广播以便进行作业、闹铃等事项的安排。
2.ACTION_USER_INITIALIZE、”android.intent.action.USER_ADDED”、”android.intent.action.USER_REMOVED”:原因:这些广播受特权保护,因此大多数正常应用无论如何都无法接收它们。
3. “android.intent.action.TIME_SET”、ACTION_TIMEZONE_CHANGED:原因:时钟应用可能需要接收这些广播,以便在时间或时区变化时更新闹铃。
4. ACTION_LOCALE_CHANGED:原因:只在语言区域发生变化时发送,并不频繁。 应用可能需要在语言区域发生变化时更新其数据。
5.ACTION_USB_ACCESSORY_ATTACHED、ACTION_USB_ACCESSORY_DETACHED、ACTION_USB_DEVICE_ATTACHED、ACTION_USB_DEVICE_DETACHED:原因:如果应用需要了解这些 USB 相关事件的信息,目前尚未找到能够替代注册广播的可行方案。
6. ACTION_HEADSET_PLUG:原因:由于此广播只在用户进行插头的物理连接或拔出时发送,因此不太可能会在应用响应此广播时影响用户体验。
7. ACTION_CONNECTION_STATE_CHANGED、ACTION_CONNECTION_STATE_CHANGED:原因:与 ACTION_HEADSET_PLUG 类似,应用接收这些蓝牙事件的广播时不太可能会影响用户体验。
8. ACTION_CARRIER_CONFIG_CHANGED、 TelephonyIntents.ACTION_*_SUBSCRIPTION_CHANGED、”TelephonyIntents.SECRET_CODE_ACTION”:原因:原始设备制造商 (OEM) 电话应用可能需要接收这些广播。
9. LOGIN_ACCOUNTS_CHANGED_ACTION:原因:一些应用需要了解登录帐号的变化,以便为新帐号和变化的帐号设置计划操作。
10. ACTION_PACKAGE_DATA_CLEARED:原因:只在用户显式地从 Settings 清除其数据时发送,因此广播接收器不太可能严重影响用户体验。
11. ACTION_PACKAGE_FULLY_REMOVED:原因:一些应用可能需要在另一软件包被移除时更新其存储的数据;对于这些应用,尚未找到能够替代注册此广播的可行方案。
12. ACTION_NEW_OUTGOING_CALL:原因:执行操作来响应用户打电话行为的应用需要接收此广播。
13. ACTION_DEVICE_OWNER_CHANGED:原因:此广播发送得不是很频繁;一些应用需要接收它,以便知晓设备的安装状态发生了变化。
14. ACTION_EVENT_REMINDER:原因:由日历提供程序发送,用于向日历应用发布事件提醒。因为日历提供程序不清楚日历应用是什么,所以此广播必须是隐式广播。
15. ACTION_MEDIA_MOUNTED、ACTION_MEDIA_CHECKING、ACTION_MEDIA_UNMOUNTED、ACTION_MEDIA_EJECT、 ACTION_MEDIA_UNMOUNTABLE、ACTION_MEDIA_REMOVED、ACTION_MEDIA_BAD_REMOVAL:原因:这些广播是作为用户与设备进行物理交互的结果(安装或移除存储卷)或启动初始化(作为已装载的可用卷)的一部分发送的,因此它们不是很常见,并且通常是在用户的掌控下。
16. SMS_RECEIVED_ACTION、WAP_PUSH_RECEIVED_ACTION:原因:这些广播依赖于短信接收应用。

解决方式:

除了例外情况外,可通过以下方式解决:
1.改为带签名权限的广播。因为这些广播只会发送到使用相同证书签名的应用,而不是发送到设备上的所有应用。至于啥是签名权限,可参考BroadcastReceiver与自定义权限
2.动态注册而不是在清单文件中注册。

参考

1.Android O行为变更–隐式广播限制
2.BroadcastReceiver与自定义权限

猜你喜欢

转载自blog.csdn.net/fengyulinde/article/details/80757986