WindowManager $ BadTokenException:无法添加窗口令牌android.os.BinderProxy无效;你的活动在运行吗?

时间:2016-11-14 08:48:36

标签: java android android-intent android-context

首先,我很抱歉再次发布此问题,我在Stackoverflow上多次发现此错误。不幸的是,这个错误是由各种原因引发的,阅读答案给了我无解。我将尝试详细描述我的问题并基于其他帖子中的问题/答案。

我在我的应用程序中使用了两个活动。第一项活动是主菜单。按菜单项完成第一个活动(firstActivity.finish())并使用intent启动第二个活动。如果我在第二个活动中完成,那么我完成它(secondActivity.finish())并且我开始第一个有意图的活动(我返回到菜单)。

我真的只需要一个当前启动的活动实例。因此,两个活动都在清单中使用android:launchMode =“singleTask”。

在我的应用程序中,我使用具有名为“Global”的公共类的库,并在应用程序中将此类扩展到AppGlobal。 “Global”类具有静态字段上下文:

 class Global {    
    public static Context context;   
 }

 class AppGlobal extends Global {
 }

在每个Activity的create方法中,我用活动实例更新上下文 - “this”。

 public class FirstActivity extends Activity {  
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        AppGlobal.context = this;
   }
}

public class SecondActivity extends Activity {  
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        AppGlobal.context = this;
   }
}

稍后,在第二个活动中,我检测到“后退”按钮,并且在按键UP事件中我想要显示对话框。

public class Video extends GLSurfaceView {
    @Override
    public boolean onKeyDown(int keyCode, final KeyEvent event) 
    {
        if (event.getRepeatCount() > 0) {
             return true;
        }
        return EmuManager.onHandleKey(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, final KeyEvent event) 
    {
        if (event.getRepeatCount() > 0) {
            return true;
        }
        return Manager.onHandleKey(keyCode, event);
    }
}

class Manager {
   public static boolean onHandleKey(int keyCode, final KeyEvent event)
   {
       if (keyCode == KeyEvent.KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
          SettingsDialog d = new SettingsDialog();
          d.show(); 
       }
       return true;
   }
}

SettingDialog需要上下文,我在构造函数中提供它:

public class SettingsDialog extends Dialog {    
     public SettingsDialog() {
           super(AppGlobal.context); 
     }
}

我从未体验过它,但是在google开发者控制台的日志中,我发现它有时在onHandleKey上的“ d.show()”崩溃:

  

android.view.WindowManager $ BadTokenException:无法添加窗口 -   令牌android.os.BinderProxy@3d2d4e99无效;是你的活动   运行?在android.view.ViewRootImpl.setView(ViewRootImpl.java:711)     在   android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)     在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)     在android.app.Dialog.show(Dialog.java:312)...

这次崩溃是非常罕见的,但它确实发生了。它仍然会不时出现在日志中。我检查了线程ID,但主线程上显示了对话框。看起来像AppGlobal.context问题。

经历过这样的人?我可以这样存储上下文吗?

0 个答案:

没有答案