專案裡有個需求,在某個頁面可能調介面或收到訊息,需要在彈一個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的方式來實現,不過感覺會有點麻煩,有空的同學可以試試