Application顯示Dialog

luckyAF發表於2018-04-04

專案裡有個需求,在某個頁面可能調介面或收到訊息,需要在彈一個dialog,最後決定在application裡實現這個彈出操作

首次嘗試

使用applcationContext,並設定dialog為系統級 and 設定許可權 android.permission.SYSTEM_ALERT_WINDOW

   AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
   builder.setMessage("俺がガンダムだ")
           .setCancelable(false);
   AlertDialog alert = builder.create();
   alert.setCancelable(false);
   alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
   // 話說這個視窗型別已經棄用了,最新的是懸浮窗型別 不過效果一樣
   alert.show();
複製程式碼

效果

Android 6.0以下正常執行,6.0以上就不彈出了出了,場面一度十分尷尬。
複製程式碼

也考慮了彈出前先請求個許可權,但是腦補了一下場景還是放棄了

第二次嘗試

其實這個需求的難點是在applcation裡獲取要顯示頁面的context,所以就可以用上神奇的ActivityLifecycleCallbacks了

   private Context mContext;
   private void initLifecycle() {
       registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
           @Override
           public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
               if(activity.getParent()!=null){//如果這個檢視是嵌入的子檢視
                   mContext = activity.getParent();
               }else {
                   mContext = activity;
               }
           }
           @Override
           public void onActivityStarted(Activity activity) {
               if(activity.getParent()!=null){
                   mContext = activity.getParent();
               }else {
                   mContext = activity;
               }
           }

           @Override
           public void onActivityResumed(Activity activity) {
               if(activity.getParent()!=null){
                   mContext = activity.getParent();
               }else {
                   mContext = activity;
               }
           }
          //.....
       });

   }

   private void showDialog(){
       AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
       builder.setMessage("俺がガンダムだ")
           .setCancelable(false);
       AlertDialog alert = builder.create();
       alert.setCancelable(false);
       alert.show();
   }
複製程式碼

這次的效果

succeed
複製程式碼

擴充套件

根據資料,還可以用service的方式來實現,不過感覺會有點麻煩,有空的同學可以試試

相關文章