活动可能不在前台时的Activity.showDialog

时间:2010-12-22 19:27:20

标签: android

我有一个活动,在显示进度对话框的同时从后台获取一些数据。当我得到数据(或错误)时,我会忽略该对话框并显示另一个对话框。

如果由于某种原因网站花费太长时间来传送响应(例如15秒以上),手机将关闭屏幕。现在,当屏幕关闭时,如果我得到响应并尝试显示对话框,则会出现错误(WindowManager $ BadTokenException:无法添加窗口 - 令牌android.os.BinderProxy@483fa968无效;是您的活动正在运行?)

这个问题的原因很简单:当屏幕关闭时,另一个活动来到前台(键盘或其他东西)。

问题:现在,对于我们知道可能未运行的活动,调用showDialog的最佳方法是什么? (活动已创建,但它不是用户正在与之交互的活动...换句话说,它处于停止状态。)

我相信如果我点击主页并更改为Home活动,就会发生类似的行为。 (虽然我不能在我的特定情况下这样做,因为我的活动会取消请求,一切都会正确关闭)。

我认为这没有任何区别,但我在Android 2.1中重现了这一点

2 个答案:

答案 0 :(得分:11)

捕获该异常并使用某种持久存储来保存一个标志,表明您正在等待显示对话框。然后在onResume()中检查该标志,如果它的真实,则显示相应的对话框。也许是这样的事情:

try {
    getYourDataFromWeb();
    showDialog()
} catch (BadTokenException e) {
    myPrefsEditor.putBoolean("FailedToShowDialog", true);
    myPrefsEditor.commit();
    e.printStackTrace();
}

然后在你的onResume()方法中这样:

if(myPrefs.getBoolean("FailedToShowDialog", false) == true){
    showDialog();
    myPrefsEditor.putBoolean("FailedToShowDialog", false);
    myPrefsEditor.commit();
}

答案 1 :(得分:1)

我使用下面的代码来判断我的命运活动是否在前台。如果没有,请不要弹出对话框。

ActivityManager am = (ActivityManager)Update.this.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
if(cn.getClassName().equals("com.xxx.xxx.xxxx") {
    showDialog();
}