一、需求
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;
}
}