WindowManager.addView() 导致 BadTokenException

rav*_*024 2 android android-service android-layout android-view android-windowmanager

我正在尝试创建一个覆盖窗口,但是当我尝试将视图添加到 WindowManager 时,它给了我一个异常。我添加了“SYSTEM_ALERT_WINDOW”权限,并在应用信息中启用了“绘制其他应用”。我从服务的 onCreate 函数中调用它。

  • 设备:运行 8.0.0 的模拟器
  • 目标 SDK 和编译的 SDK 版本:26
  • AppCompat 版本:26.0.0

代码:

    WindowManager manager = (WindowManager)getSystemService(WINDOW_SERVICE);
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    RelativeLayout overlay = (RelativeLayout) inflater.inflate(R.layout.button_main, null);

    final WindowManager.LayoutParams params =
            new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
                    0,
                    PixelFormat.TRANSLUCENT);


    params.gravity = Gravity.TOP | Gravity.START;
    params.x = 0;
    params.y = 0;

    manager.addView(overlay, params);
Run Code Online (Sandbox Code Playgroud)

异常堆栈跟踪:

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:764
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
Run Code Online (Sandbox Code Playgroud)

无论我为 LayoutParams 使用什么类型,我总是会遇到这种崩溃。

小智 6

使用 TYPE_APPLICATION_OVERLAY。它是 Android O 允许在其他应用上显示的唯一窗口类型。

看看这个解释:https : //developer.android.com/preview/behavior-changes.html#cwt