這篇文章主要為大家展示了“Android8.1.0Service中如何彈出Dialog”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Android8.1.0Service中如何彈出Dialog”這篇文章吧。

場景:在Service 中開啟線程下載升級包,當下載完系統(tǒng)升級包,彈出一個Dialog 提示用戶。
注意,Android 系統(tǒng)版本不一樣,可能會有不一樣的表現(xiàn)。當前是基于 Android 8.1.0 的 Service 中彈 Dialog。
首先,就是要在功能清單列表中聲明權(quán)限,以下兩個都必須聲明:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/><!--這行代碼必須存在,否則點擊不了系統(tǒng)設(shè)置中的按鈕--> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
然后必須要在MainActivity 進行初始化的時候,再次檢查一下當前應(yīng)用有沒有被允許顯示在其他應(yīng)用上層,這一步必不可少。因為當前基于 Android 8.1.0,自從Android 6.0 以后,Google 就對一些敏感權(quán)限做了收斂,比如訪問SD卡權(quán)限,只是在功能清單列表中聲明權(quán)限是不夠的,還要在應(yīng)用運行期間動態(tài)檢查是否被授權(quán),需注意當檢查出來應(yīng)用未被授予這些權(quán)限,還要提醒用戶可能有一些功能無法使用,這個需要注意。
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) { } }); //下面這行代碼放到子線程中會 Can't create handler inside thread that has not called Looper.prepare() AlertDialog dialog = builder.create(); //設(shè)置點擊其他地方不可取消此 Dialog dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(false); //8.0系統(tǒng)加強后臺管理,禁止在其他應(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了。
以上是“Android8.1.0Service中如何彈出Dialog”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文題目:Android8.1.0Service中如何彈出Dialog-創(chuàng)新互聯(lián)
當前路徑:http://chinadenli.net/article4/hjgie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、網(wǎng)站維護、做網(wǎng)站、電子商務(wù)、小程序開發(fā)、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容