1. 程式人生 > 程式設計 >淺析Android Service中實現彈出對話方塊的坑

淺析Android Service中實現彈出對話方塊的坑

一、手機版本問題,大多數文章沒有涉及這個點,導致他們的程式碼並無法正常使用

M版本以上需要使用的Type--> TYPE_APPLICATION_OVERLAY

AlertDialog.Builder builder=new AlertDialog.Builder(getApplicationContext()); 
builder.setTitle("提示"); 
builder.setMessage("service彈框"); 
builder.setNegativeButton("明白了",null); 
Dialog dialog=builder.create();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){//6.0       
  dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);        
}else {       
  dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);        
} 
dialog.show();

同時,因為涉及不同版本的Android系統

AndroidManifest.xml 中宣告同時需要這兩個型別對應的許可權

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

二、許可權問題,service中彈出的對話方塊為系統彈框,在M版本以上需要申請懸浮窗許可權

Android 6.0 以前懸浮窗是預設允許的

注意Android 6.0以後的使用

因為懸浮窗許可權 SYSTEM_ALERT_WINDOW 屬於特殊許可權 ,需要自己特別單獨申請

特殊許可權,顧名思義,就是一些特別敏感的許可權,在Android系統中,主要由兩個

SYSTEM_ALERT_WINDOW(設定懸浮窗,進行一些黑科技)
WRITE_SETTINGS (修改系統設定)

關於上面兩個特殊許可權的授權,做法是使用startActivityForResult啟動授權介面來完成。

申請方式:

private static final int REQUEST_CODE = 1;
private void requestAlertWindowPermission() {
  Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
  intent.setData(Uri.parse("package:" + getPackageName()));
  startActivityForResult(intent,REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
  super.onActivityResult(requestCode,resultCode,data);
  if (requestCode == REQUEST_CODE) {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
     if (Settings.canDrawOverlays(this)) {
        Log.i("xqxinfo","onActivityResult granted");
     }
   } 
  } 
}

總結

到此這篇關於淺析Android Service中實現彈出對話方塊的坑的文章就介紹到這了,更多相關Service實現彈出對話方塊內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!