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;
    }
}





        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章