溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android8.1.0Service中如何彈出Dialog

發(fā)布時(shí)間:2021-09-27 11:35:39 來(lái)源:億速云 閱讀:114 作者:小新 欄目:編程語(yǔ)言

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

場(chǎng)景:在Service 中開(kāi)啟線程下載升級(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)用有沒(méi)有被允許顯示在其他應(yīng)用上層,這一步必不可少。因?yàn)楫?dāng)前基于 Android 8.1.0,自從Android 6.0 以后,Google 就對(duì)一些敏感權(quán)限做了收斂,比如訪問(wèn)SD卡權(quán)限,只是在功能清單列表中聲明權(quán)限是不夠的,還要在應(yīng)用運(yùn)行期間動(dòng)態(tài)檢查是否被授權(quán),需注意當(dāng)檢查出來(lái)應(yīng)用未被授予這些權(quán)限,還要提醒用戶可能有一些功能無(wú)法使用,這個(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();        }      }    }  }

接下來(lái),在 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了。

以上是“Android8.1.0Service中如何彈出Dialog”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI