欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android 8.1.0 Service 中 彈出 Dialog的方法

 更新時(shí)間:2019年10月18日 09:12:09   作者:Water_Marking  
這篇文章主要介紹了Android 8.1.0 Service 中怎么彈出 Dialog問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

場(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)注明出處,謝謝!

相關(guān)文章

最新評(píng)論