android targetSdkVersion>=26收不到广播的处理

背景:GP新政策,要求Google Player上架应用的targetSdkVersion>=26。

一、 为啥GP要求targetSdkVersion>=26?

1 targetSdkVersion是啥?有什么作用?

targetSdkVersion是App在打包时可以指定的一个参数。跟一台设备执行哪个版本的代码有关。

举例:

我们都知道android 6.0(api level 23)上有了权限验证机制,比如获取地理位置信息。现在有一台6.0的设备,我们却可以在上面不需要用户授权就获取此权限。具体操作:打包时将targetSdkVersion设置<23即可,因为源码里面会判断ApplicationInfo里的targetSdkVersion,如果小于23的话,是不需要授权的。

2 GP为什么出这个新政策?

  • 为了解决新设备上还是跑旧API的漏洞。
  • 其它原因,比如给设备省电等。

android里面广播分为粘性广播(sticky)和非粘性广播,非粘性广播时即时的,粘性广播有缓存时间。
举例:

一个部门在开会,主管公布了一个消息,今晚聚餐。这时有人迟到了,主管表示公布完五分钟内到达的人,会跟他们再讲这个消息。这就是粘性广播。
后面迟到的人不会知道这个消息。这就是非粘性广播。

targetSdkVersion>26的话,在manifest里面注册的粘性广播,将不能收到。

二、解决方案

官方解决方案

广播动态注册。

示例:

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");
        intentFilter.addDataScheme("package");
        context.registerReceiver(new PackageBroadcastReceiver(), intentFilter);

其他解决方案

有一种场景是,SDK开发,用户没有初始化你,但你必须要自己跑起来。
此时有两种解决办法:

  • manifest注册非粘性广播
    示例:
        <receiver android:name="com.test.PackageBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
  • manifest注册ContentProvider
    示例:
        <provider
            android:name="com.test.TestContentProvider"
            android:authorities="${applicationId}" />

然后在ContentProvider的onCreate()方法里做你要的操作就可以了。

posted @ 2018-08-27 11:23  这个人在加班  阅读(2295)  评论(0编辑  收藏  举报