Android 获取栈顶activity并在service 中弹出全局dialog解决方法

一、需求

     1 -> 在service中执行定时请求接口,适当的时候显示 自定义dialog。

    二、现象

2 -> 按照正常的显示dialog代码,会报  

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?</span>
      的错误

三、解决方法

1 -> 先谈谈自己解决路上的坑,尝试了用 网上的方法 (1.通过 WindowManager 去添加 view 。 2. 设置dialog的window 的type)但是发现都不理想(其中第二种方法在4.4上成功,但是5.1上又不行了。而且是用的系统的alertdialog)。

2 -> 现在上解决方法,代码如下,在自己的 Application 中去记录activity,在service 中可以通过 MyApplication.getInstance().getCurrentActivity()去调用获取当前最上面activity。此时,dialog 所需要的context 就可以满足在不确定activity 时候显示了,Done。。。

// 1.新建MyApplication
public class MyApplication extends Application {
    private final String TAG = getClass().getSimpleName();
    private static MyApplication mInstance;
    private Activity mActivity = null;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        // onCreate 方法中 监听activity 的生命周期
        initGlobeActivity();
    }

   
    private void initGlobeActivity(){
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            // 此处记录最后的activity
                mActivity = activity;
                LogUtil.e(TAG,activity+"onActivityCreated");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                LogUtil.e(TAG,activity+"onActivityDestroyed");
            }

            /** Unused implementation **/
            @Override
            public void onActivityStarted(Activity activity) {
                LogUtil.e(TAG,"onActivityStarted");
            }

            @Override
            public void onActivityResumed(Activity activity) {
                LogUtil.e(TAG,"onActivityResumed");
            }
            @Override
            public void onActivityPaused(Activity activity) {
                LogUtil.e(TAG,"onActivityPaused");
            }

            @Override
            public void onActivityStopped(Activity activity) {
                LogUtil.e(TAG,"onActivityStopped");
            }

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

    public static MyApplication getInstance(){
        return mInstance;
    }

    /**
    *公开方法,外部可通过 MyApplication.getInstance().getCurrentActivity() 获取到当前最上层的activity
    */
    public Activity getCurrentActivity() {
        return mActivity;
    }
}




          


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值