zoukankan      html  css  js  c++  java
  • 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()方法里做你要的操作就可以了。

  • 相关阅读:
    拓扑排序问题
    向陈越姥姥哭诉----关键活动
    最小生成树之Prim算法和Kruskal算法
    1212. Team Scores in Football Tournament
    1205. 每月交易II
    1098. 小众书籍
    1204. Last Person to Fit in the Elevator
    579. 查询员工的累计薪水
    1127. User Purchase Platform
    1225. 报告系统状态的连续日期
  • 原文地址:https://www.cnblogs.com/diffx/p/9541154.html
Copyright © 2011-2022 走看看