Android 8.0完美適配全域性dialog 懸浮窗彈出
阿新 • • 發佈:2019-02-19
前言
最近專案targetSdkVersion升級到了26,出現很多問題趟了很多坑,其中就包括本篇的需要解決的問題:全域性dialog 不顯示。
出現場景
有時候我們需要在App中彈dialog,但是卻不知道依附的是哪個Activity,這個時候通常會啟動一個service來依附,顯示一個全域性的dialog。
Android 6.0出現的懸浮窗許可權
為什麼從6.0說起?
在Android6.0之後,使用懸浮窗功能需要申請開啟懸浮窗許可權,在API23以下版本編譯,懸浮窗許可權關閉的,但是沒有許可權限制,在大於23版本編譯,這個許可權預設是關閉的,需要獲取許可權。而且每次使用的時候都要檢測並獲取許可權,因為這個許可權可以手動關閉。
- 在6.0之前就有的許可權,預設在清單檔案中註冊:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
此許可權在6.0之後不能彈出全域性彈框。
- 6.0之後判斷是否有懸浮窗許可權,沒有則申請許可權
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(MainActivity.this)) {
Intent intent = new Intent(MainActivity.this, MainService.class);
startService(intent);
finish();
} else {
//若沒有許可權,提示獲取.
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
Toast.makeText(MainActivity.this ,"需要取得許可權以使用懸浮窗",Toast.LENGTH_SHORT).show();
startActivity(intent);
}
}else {
//SDK在23以下,不用管.
Intent intent = new Intent(MainActivity.this, MainService.class);
startService(intent);
finish();
}
Android 8.0對懸浮窗彈框優化
- Android8.0 修訂記錄中的內容:
Android8.0懸浮窗許可權加強.png
2. 主要程式碼
//8.0系統加強後臺管理,禁止在其他應用和視窗彈提醒彈窗,如果要彈,必須使用TYPE_APPLICATION_OVERLAY
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
}else {
dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
}
dialog.show();
注意一點,這個在全域性dialog顯示中才會出現,也就是說沒有具體的Activity依附,再者,顯示的dialog也需要加入theme,不然會報錯。
最後,希望此篇部落格對大家有所幫助,歡迎提出問題及建議共同探討,如有興趣可以關注我的部落格,謝謝!