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()方法里做你要的操作就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM