您的位置:首页 > 移动开发 > Android开发

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

2016-07-21 13:05 766 查看

一、需求

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



        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: