1. 程式人生 > >Android 彈出全域性dialog

Android 彈出全域性dialog

專案中需要在網路斷開連線時設定全域性彈出框提醒,要求當網路斷開的時候,在app內的任一頁面均能彈出提示框提示使用者網路斷開,開始認為dialog需要依附在Activity上,後經查詢可採取懸浮窗的模式,使其不必依附於Activity,可在任一頁面彈出,程式碼如下:

  AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
                    AlertDialog dialog=builder.setMessage("pc端斷開連線,請及時儲存編輯文件!")
                            .setPositiveButton("確定",new DialogInterface.OnClickListener(){
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                }
                            }).create();
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                    dialog.setCanceledOnTouchOutside(false);//點選螢幕不消失
                    if (!dialog.isShowing()){//此時提示框未顯示
                        dialog.show();
                    }
需新增dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);設定dialog的型別,同時要在清單檔案中配置:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
新增該許可權,若仍無法顯示要到手機設定頁面的,應用管理,找到自己的應用開啟懸浮窗許可權,若還是不行,可點選以下連結,尋找解決方法:

參考其他需要懸浮窗許可權的app,都是預設不開啟(測試機魅藍note3),這就導致需要提醒使用者設定,網上查閱資料,判斷該許可權是否開啟,需要適配多種機型,極為不便,後經查詢,可將dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);改為dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);,此時不需要懸浮窗許可權開啟,該全域性提示框亦可彈出。

---------------------------分割線-------------------------------------------------------

使用dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);會遇到版本問題,在Android 4.4以下,TYPE_TOAST雖不需要許可權亦可彈出,但是取消了介面互動功能,無法獲取觸控事件,造成主動點選按鈕,dialog不消失,因此需要版本判斷,問題詳情見以下連結: