Android 8.0如何完美適配全局dialog懸浮窗彈出
前言
最近項(xiàng)目targetSdkVersion升級(jí)到了26,出現(xiàn)很多問題趟了很多坑,其中就包括本篇的需要解決的問題:全局dialog 不顯示。
出現(xiàn)場景
有時(shí)候我們需要在App中彈dialog,但是卻不知道依附的是哪個(gè)Activity,這個(gè)時(shí)候通常會(huì)啟動(dòng)一個(gè)service來依附,顯示一個(gè)全局的dialog。
Android 6.0出現(xiàn)的懸浮窗權(quán)限
為什么從6.0說起?
在Android6.0之后,使用懸浮窗功能需要申請(qǐng)開啟懸浮窗權(quán)限,在API23以下版本編譯,懸浮窗權(quán)限關(guān)閉的,但是沒有權(quán)限限制,在大于23版本編譯,這個(gè)權(quán)限默認(rèn)是關(guān)閉的,需要獲取權(quán)限。而且每次使用的時(shí)候都要檢測并獲取權(quán)限,因?yàn)檫@個(gè)權(quán)限可以手動(dòng)關(guān)閉。
在6.0之前就有的權(quán)限,默認(rèn)在清單文件中注冊(cè):
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
此權(quán)限在6.0之后不能彈出全局彈框。
6.0之后判斷是否有懸浮窗權(quán)限,沒有則申請(qǐng)權(quán)限
<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 { //若沒有權(quán)限,提示獲取. Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); Toast.makeText(MainActivity.this,"需要取得權(quán)限以使用懸浮窗",Toast.LENGTH_SHORT).show(); startActivity(intent); } }else { //SDK在23以下,不用管. Intent intent = new Intent(MainActivity.this, MainService.class); startService(intent); finish(); }
Android 8.0對(duì)懸浮窗彈框優(yōu)化
Android8.0 修訂記錄中的內(nèi)容:
Android8.0懸浮窗權(quán)限加強(qiáng).png
主要代碼
//8.0系統(tǒng)加強(qiáng)后臺(tái)管理,禁止在其他應(yīng)用和窗口彈提醒彈窗,如果要彈,必須使用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();
注意一點(diǎn),這個(gè)在全局dialog顯示中才會(huì)出現(xiàn),也就是說沒有具體的Activity依附,再者,顯示的dialog也需要加入theme,不然會(huì)報(bào)錯(cuò)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- android 添加隨意拖動(dòng)的桌面懸浮窗口
- Android實(shí)現(xiàn)桌面懸浮窗、蒙板效果實(shí)例代碼
- 不依賴于Activity的Android全局懸浮窗的實(shí)現(xiàn)
- Android 懸浮窗權(quán)限各機(jī)型各系統(tǒng)適配大全(總結(jié))
- Android應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)方案示例
- Android實(shí)現(xiàn)類似360,QQ管家那樣的懸浮窗
- Android實(shí)現(xiàn)類似qq微信消息懸浮窗通知功能
- Android懸浮窗屏蔽懸浮窗外部所有的點(diǎn)擊事件的實(shí)例代碼
- Android 獲取判斷是否有懸浮窗權(quán)限的方法
- android仿華為手機(jī)懸浮窗設(shè)計(jì)
相關(guān)文章
Android 程序執(zhí)行Linux命令的解決方法及注意事項(xiàng)
這篇文章主要介紹了Android 程序執(zhí)行LINUX命令的解決方法及注意事項(xiàng),本文通過問題描述最終到解決方法,給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12Android開發(fā)注解排列組合出啟動(dòng)任務(wù)ksp
這篇文章主要為大家介紹了Android開發(fā)注解排列組合出啟動(dòng)任務(wù)ksp示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06android 傳感器(OnSensorChanged)使用介紹
當(dāng)傳感器的值發(fā)生變化時(shí),例如磁阻傳感器方向改變時(shí)會(huì)調(diào)用OnSensorChanged(). 當(dāng)傳感器的精度發(fā)生變化時(shí)會(huì)調(diào)用OnAccuracyChanged()方法2014-11-11詳解Android中的NestedScrolling機(jī)制帶你玩轉(zhuǎn)嵌套滑動(dòng)
這篇文章主要給大家詳細(xì)解析了Android中的NestedScrolling機(jī)制,通過介紹該機(jī)制帶你玩轉(zhuǎn)Android中的嵌套滑動(dòng)效果,文中給出了詳細(xì)的示例代碼和介紹,需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。2017-05-05Android在Sqlite3中的應(yīng)用及多線程使用數(shù)據(jù)庫的建議(實(shí)例代碼)
這篇文章主要介紹了Android在Sqlite3中的應(yīng)用及多線程使用數(shù)據(jù)庫的建議,包括編寫數(shù)據(jù)庫具體操作類、增刪改查,通過實(shí)例代碼介紹了在實(shí)際中的應(yīng)用,需要的朋友可以參考下2022-04-04Android應(yīng)用中制作選中后圖標(biāo)變大浮動(dòng)效果的代碼分享
這篇文章主要介紹了Android應(yīng)用中制作選中后圖標(biāo)變大浮動(dòng)效果的代碼分享,這里作者舉了一個(gè)體育賽事app的例子,需要的朋友可以參考下2016-02-02Android中的Handler與多線程應(yīng)用實(shí)例
這篇文章主要介紹了Android中的Handler與多線程應(yīng)用實(shí)例,本文首先解釋一下handler是用來干嘛的,然后通過例子介紹其在多線程中的應(yīng)用,需要的朋友可以參考下2015-03-035步教你快速寫一個(gè)android Router路由框架
本篇文章主要介紹了5步教你快速寫一個(gè)Router路由框架(詳細(xì)步驟),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11