雖然 Android 9.0 都已經面世了,本篇文章寫的有點遲了。 但是遲到好過不到,因此基於此這邊還是記錄一下項目中遇到的 Android 8.0 的坑及對應解決方法。 每次系統升級,雖然系統功能更加強大了,各方面性能也提高了。 但是對於開發者而言,一個困擾的問題也是隨之而來——相容。 尤其對於一 ...
雖然 Android 9.0 都已經面世了,本篇文章寫的有點遲了。
但是遲到好過不到,因此基於此這邊還是記錄一下項目中遇到的 Android 8.0 的坑及對應解決方法。
每次系統升級,雖然系統功能更加強大了,各方面性能也提高了。
但是對於開發者而言,一個困擾的問題也是隨之而來——相容。
尤其對於一些已經上市的 App 而言,在新系統發佈之前就要瞭解到底有哪些改動,以避免用戶升級新系統後導致 App 沒法正常運行。
好了,回歸主題,說說 Android 8.0 裡面的幾個坑吧。
喚不起系統安裝器
如果你的 App 提供了更新功能,用戶點擊更新,你下載完 Apk 之後會自動彈出安裝界面。
這個安裝界面的彈出就是依賴於系統的安裝器。
假設你在 Android 8.0 以下的手機操作正常,但是在 8.0 的手機上,你會發現,下載完之後完全沒反應。
這個時候
假設你以為說彈個提示讓用戶自己安裝,我想說
用戶才不會理你。用戶分分鐘就不更新了。
所以說我們要解決這個問題。讓這個安裝器在 Android 8.0 的手機也能正常喚起。
其實解決方法非常簡單。
只需要在 AndroidManifest.xml 中聲明以下許可權即可。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
而且還不需要你在代碼動態申請,是不是 So easy。
一行代碼解決這個相容性問題。
通知問題
假設你的 App 需要在任務欄顯示通知。如果你是按照 Android 8.0 之前的寫法的話。那麼在 8.0 的手機上面你是顯示不了的。
那怎麼辦呢?
關於通知的基本寫法這邊就不再贅餘,如果不清楚的小伙伴自行查閱資料。這邊重點說下解決方法。
首先說下下麵代碼出現的幾個變數:
private static NotificationManager manager;
public static final String NOTIFICATION_CHANNEL = "your app pkg name";
private static final String NOTIFICATION_CHANNEL_NAME = "App Channel";
第一個寫過通知的都知道,一個管理類。
第二個是通知的一個 CHANNEL,這個也是 8.0 之後才引入的。取值 App 包名即可。
第三個自定義,只要保證唯一即可。
相容有兩步需要操作。
1. 創建Channel
private static void createChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notifyChannel = new NotificationChannel(NOTIFICATION_CHANNEL,
NOTIFICATION_CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT);
notifyChannel.setLightColor(Color.GREEN);
notifyChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
manager.createNotificationChannel(notifyChannel);
}
}
2. 獲取 Notification.Builder
private Notification.Builder getNotificationBuilder(Context sourceContext) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return new Notification.Builder(sourceContext, NOTIFICATION_CHANNEL);
} else {
return new Notification.Builder(sourceContext);
}
}
可以看到,上面的操作都以 8.0 作為分界處理。
做完這兩步,之前不能顯示通知的 App 就可以顯示了。
更多內容可以看官方示例:
https://github.com/googlesamples/android-NotificationChannels/