原标題:Android 全局彈出對話框SYSTEM_ALERT_WINDOW權限
方案一、
1、在開發中有時會用到全局彈出對話框但必須在manifest中申請權限:
2、建立Dialog
AlertDialog.Builder builder= newAlertDialog.Builder( this);
builder.setIcon(R.drawable.logo_mini);
builder.setTitle( "下線通知").setMessage( "該賬号在另一台Android裝置上登入。")
.setPositiveButton( "重新登陸", newDialogInterface.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog, intwhich){
//do somthing
}
}).setNegativeButton( "退出", newDialogInterface.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog, intwhich){
Intent i= newIntent(CoreService. this,LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
});
alertDialog = builder.create();
alertDialog.setCancelable( false);
alertDialog.setCanceledOnTouchOutside( false);
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
注意要設定Dialog的Window類型為
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT。
方案二、
采用方案一帶來的問題:
使用者在安裝應用時會詢問使用者是否授權問題
同時在小米手機上預設是禁止系統彈出框的,應用中的系統彈出框将不能夠彈出
那能不能不申請系統權限,又能彈出提示框提示使用者呢?
這裡妨轉換思路,既然系統彈出框彈不出,我們就不采用系統彈出框,給他彈個Activity替代。但這個時候注意,要再Service是中或者ApplicationContext中startActivity時要添加額外标志ntent.FLAG_ACTIVITY_NEW_TASK:
Intent i=new Intent( this,ActDialog. class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
//代碼中ActDialog其實是一個Activity把主題給它應用@android:style/Theme.Dialog
//把activity做的像一個Dialog的風格
這樣解決了權限申請和小米手機全局Dialog預設無法展示的問題。
最後補充一下在方案一中也可以不申請權限就能彈出對話框,将彈出Window type 改為LayoutParams.TYPE_TOAST,但是這種類型的彈出框是不能接受事件處理的。傳回搜狐,檢視更多
責任編輯: