Android O 对隐式广播的限制以及对策

Android O 应该快要发布正式版了,和 N 一样又是一个用户乍一看在表面上没什么改变的版本,但其实对安全、隐私和规范应用行为做了很多改变

改变中很重要的一部分就是后台执行限制,其中就有对广播(Broadcast)的限制 ,许多隐式广播无法被在 manifest 中静态注册的 BroadcastReceiver 收到。

除了这些由系统发出的隐式广播之外,我们在自己应用里定义的广播也无法被静态注册的 BroadcastReceiver 收到了。
以下是几个解决方案:

1.动态注册 BroadcastReceiver

因为 registerReceiver() 方法只能从一个运行的进程里调用,也就是说你需要一个正在运行的 Activity 或者一个后台 Service ,这样的方法虽然万用但是这个进程终究会被  kill 导致广播收不到。

2.JobScheduler

官方推荐使用 JobScheduler 代替原来用隐式广播实现的「当某条件达成时发生广播完成某事」的「周期性」功能,并没有广播那么灵活。

3.改为显式广播

如果广播只是 App 自己发自己收,那么改为显式广播是最简单的。

但是如果要发给其他 App 接收,而且不知道他们的包名的情况下,该怎么做的。
通过pm把所有隐式注册了这个自定义广播的 App列出来,然后转成显式调用

 

 

参考:https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html

发表评论