詳解Android 8.1.0 Service 中 彈出 Dialog的方法
場(chǎng)景:在Service 中開啟線程下載升級(jí)包,當(dāng)下載完系統(tǒng)升級(jí)包,彈出一個(gè)Dialog 提示用戶。
注意,Android 系統(tǒng)版本不一樣,可能會(huì)有不一樣的表現(xiàn)。當(dāng)前是基于 Android 8.1.0 的 Service 中彈 Dialog。
首先,就是要在功能清單列表中聲明權(quán)限,以下兩個(gè)都必須聲明:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/><!--這行代碼必須存在,否則點(diǎn)擊不了系統(tǒng)設(shè)置中的按鈕--> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
然后必須要在MainActivity 進(jìn)行初始化的時(shí)候,再次檢查一下當(dāng)前應(yīng)用有沒有被允許顯示在其他應(yīng)用上層,這一步必不可少。因?yàn)楫?dāng)前基于 Android 8.1.0,自從Android 6.0 以后,Google 就對(duì)一些敏感權(quán)限做了收斂,比如訪問SD卡權(quán)限,只是在功能清單列表中聲明權(quán)限是不夠的,還要在應(yīng)用運(yùn)行期間動(dòng)態(tài)檢查是否被授權(quán),需注意當(dāng)檢查出來應(yīng)用未被授予這些權(quán)限,還要提醒用戶可能有一些功能無法使用,這個(gè)需要注意。
private void checkMyPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, 1); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Settings.canDrawOverlays(this)) { Toast.makeText(this, "授權(quán)成功", Toast.LENGTH_SHORT).show(); }else { // SYSTEM_ALERT_WINDOW permission not granted... Toast.makeText(this, "未被授予權(quán)限,相關(guān)功能不可用", Toast.LENGTH_SHORT).show(); } } } }
接下來,在 Service 中,做如下操作:
//在 Service 中創(chuàng)建全局變量 mHandler private Handler mHandler; //在 Service 生命周期方法 onCreate() 中初始化 mHandler mHandler = new Handler(Looper.getMainLooper()); //在子線程中想要 Toast 的地方添加如下 mHandler.post(new Runnable() { @Override public void run() { //show dialog justShowDialog(); } }); private void justShowDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()) .setIcon(android.R.drawable.ic_dialog_info) .setTitle("service中彈出Dialog了") .setMessage("是否關(guān)閉dialog?") .setPositiveButton("確定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); //下面這行代碼放到子線程中會(huì) Can't create handler inside thread that has not called Looper.prepare() AlertDialog dialog = builder.create(); //設(shè)置點(diǎn)擊其他地方不可取消此 Dialog dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(false); //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(); }
這樣,在 " Android低版本 -> Android 6.0 -> Android 8.0 -> 更高Android版本" 均可以彈出 Dialog了。
總結(jié)
以上所述是小編給大家介紹的Android 8.1.0 Service 中 彈出 Dialog的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
上一篇:RecyclerView+PagerSnapHelper實(shí)現(xiàn)抖音首頁(yè)翻頁(yè)的Viewpager效果
欄 目:Android
下一篇:如何使用Flutter實(shí)現(xiàn)58同城中的加載動(dòng)畫詳解
本文標(biāo)題:詳解Android 8.1.0 Service 中 彈出 Dialog的方法
本文地址:http://mengdiqiu.com.cn/a1/Android/9145.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方法詳解
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)登錄
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代碼
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
- 01-10android異步消息機(jī)制 源碼層面徹底解析(1)


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子