android 懸浮窗相關小記

來源:Android 8.0完美適配全局dialog 懸浮窗彈出
1

前言

最近項目targetSdkVersion升級到了26,出現很多問題趟了很多坑,其中就包括本篇的需要解決的問題:全局dialog 不顯示。

2

出現場景

有時候我們需要在App中彈dialog,但是卻不知道依附的是哪個Activity,這個時候通常會啓動一個service來依附,顯示一個全局的dialog。

3

6.0出現的懸浮窗權限

爲什麼從6.0說起?

在Android6.0之後,使用懸浮窗功能需要申請開啓懸浮窗權限,在API23以下版本編譯,懸浮窗權限關閉的,但是沒有權限限制,在大於23版本編譯,這個權限默認是關閉的,需要獲取權限。而且每次使用的時候都要檢測並獲取權限,因爲這個權限可以手動關閉。

在6.0之前就有的權限,默認在清單文件中註冊:

此權限在6.0之後不能彈出全局彈框。

6.0之後判斷是否有懸浮窗權限,沒有則申請權限

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();
}
4

8.0對懸浮窗的優化

1.Android8.0 修訂記錄中的內容:

主要代碼

//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,不然會報錯。

最後,希望此篇博客對大家有所幫助,歡迎提出問題及建議共同探討,如有興趣可以關注我的博客,謝謝!

原文發佈於微信公衆號 - Android機動車(JsAndroidClub)

原文發表時間:2018-08-30

本文參與騰訊雲自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享。

發表於 2018-09-29

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章