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