不用悬浮窗权限弹出全局dialog的解决方法

989 阅读1分钟

如何在application弹出一个全局的dialog?

思路一: 直接在application new dialog执行show方法.

问题,直接在application或服务中new dialog传入的context都是系统的context,需要申请悬浮窗权限,而安卓系统众多,比如小米vivo等,不同的手机申请悬浮窗权限的方式不同,检测是否有悬浮窗权限的方式也不同.导致需要维护很大一段代码来进行,不同手机不同安卓版本的悬浮窗权限的检测申请,我们需要做大量操作.

思路二:

直接在application中new dialog 但是我们在给他context的时候是给他的栈顶activity的context,这样就可以让dialog根据栈顶activity的context,那么谁在栈顶,就是谁弹出.

思路二正确答案解析:

1.在Application中创建dialog

DialogBuilder builder;//这里定义读者自己的dialog
//此方法在需要弹出全局唯一dialog时调用
if (builder != null && builder.isShowing()) {
} else {
    builder = new DialogBuilder(app_activity).setTitle("提示")
            .setMessage(loginOutBus.getMsg())
            .setSimpleConfirmButton(com.zhiup.base.R.string.base_confirm, new DialogInterface.OnClickListener(){
    @Override
    public void onClick(DialogInterface dialog, int which) {
        RxBus.getInstance().send(new GoToLoginBus());
    }
});

builder.show();

2.获取栈顶activity实例

private Activity app_activity = null;//此声明定义在application中
//此方法定义在Application中并在onCreate中调用
private void initGlobeActivity() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                app_activity = activity;
                Log.e("onActivityCreated===", app_activity + "");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.e("onActivityDestroyed===", app_activity + "");
            }

            /** Unused implementation **/
            @Override
            public void onActivityStarted(Activity activity) {
                app_activity = activity;
                Log.e("onActivityStarted===", app_activity + "");
            }

            @Override
            public void onActivityResumed(Activity activity) {
                app_activity = activity;
                Log.e("onActivityResumed===", app_activity + "");
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.e("onActivityPaused===", app_activity + "");
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.e("onActivityStopped===", app_activity + "");
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
        });
    }