建议在 `DirectDialActivity` 的当前生命周期状态判断后再显示对话框,并确保所有异步回调都绑定到正确的生命周期。 android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@bd64294 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:1202)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:475)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:130)
at android.app.Dialog.show(Dialog.java:578)
at com.dianming.editor.d.a(Unknown Source:15)
at com.dianming.phonepackage.DirectDialActivity.x(Unknown Source:20)
at com.dianming.phonepackage.DirectDialActivity.d(Unknown Source:0)
at com.dianming.phonepackage.DirectDialActivity$c.d(Unknown Source:2)
at com.dianming.phonepackage.keyboard.GestureView.a(Unknown Source:19)
at com.dianming.phonepackage.keyboard.a.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:900)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8676)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
打通一通电话,对方没有接通,或者因为空号等原因没有接通,快速挂断会直接卡出 ANR,导致应用无响应。下面贴一段错误日志,方便技术同学优化。这个异常是 `WindowManager.BadTokenException`,表示在尝试通过 `Dialog.show()` 显示对话框时,应用尝试附加到的窗口 token 已经失效,通常是因为 Activity 已经销毁或正在 finishing,但后台任务仍然尝试弹出对话框。
建议处理方案:
1. 在显示对话框前检查 Activity 状态:
```java
if (!isFinishing() && !isDestroyed()) {
dialog.show();
}
```
2. 使用 `Lifecycle` 或 `onPostResume()` 等生命周期回调确保安全时机。
3. 如果对话框异步触发,考虑使用 `getSupportFragmentManager()` 的 DialogFragment 并处理生命周期,或使用 `Context` 从 Application 上下文创建对话(但需注意类型)。
4. 找到调用链:`DirectDialActivity` 中的 `x()` 和 `d()` 方法,以及 `GestureView` 和 `Handler` 回调中的逻辑,避免在 Activity 不可见时执行 UI 操作。
建议在 `DirectDialActivity` 的当前生命周期状态判断后再显示对话框,并确保所有异步回调都绑定到正确的生命周期。 android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@bd64294 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:1202)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:475)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:130)
at android.app.Dialog.show(Dialog.java:578)
at com.dianming.editor.d.a(Unknown Source:15)
at com.dianming.phonepackage.DirectDialActivity.x(Unknown Source:20)
at com.dianming.phonepackage.DirectDialActivity.d(Unknown Source:0)
at com.dianming.phonepackage.DirectDialActivity$c.d(Unknown Source:2)
at com.dianming.phonepackage.keyboard.GestureView.a(Unknown Source:19)
at com.dianming.phonepackage.keyboard.a.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:900)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8676)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)