首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

android.view.WindowManager$BadTokenException:无法添加窗口--标记null无效;自定义组件

android.view.WindowManager$BadTokenException是Android开发中常见的一个异常错误。它表示无法添加窗口,通常是由于窗口Token为空导致的。在理解这个异常之前,我们先了解一下Android窗口和Token的概念。

Android中的窗口是应用程序与用户界面进行交互的基本单位,可以是Activity、Dialog、PopupWindow等。每个窗口都有一个唯一的Token,用于标识该窗口。Token可以理解为窗口的身份证,用于区分不同的窗口。

而当我们在添加一个窗口时,需要提供有效的Token来唯一标识该窗口所属的上下文环境。如果Token为空或无效,就会抛出WindowManager$BadTokenException异常。

造成该异常的原因往往是因为上下文环境发生了变化或失效,例如在Activity销毁后仍然尝试添加窗口、在异步任务中尝试添加窗口等。

要解决这个异常,我们可以采取以下几个方案:

  1. 确保窗口添加的时机正确:在Activity生命周期合适的阶段添加窗口,如在onCreate()、onResume()等方法中添加窗口,避免在Activity销毁后添加窗口。
  2. 确保使用有效的上下文环境:确保提供给WindowManager的上下文环境是有效的,可以使用getApplicationContext()来获取应用的全局上下文。
  3. 在异步任务中避免添加窗口:如果需要在异步任务中添加窗口,需要注意异步任务执行完毕后,确保上下文环境仍然有效,避免在失效的上下文环境中尝试添加窗口。

总结起来,避免android.view.WindowManager$BadTokenException异常的关键是确保提供有效的窗口Token和上下文环境,并在合适的时机添加窗口。

对于自定义组件,同样需要遵循以上原则。在自定义组件中添加窗口时,要确保正确处理上述异常情况,以保证应用的稳定性和可靠性。

针对该问题,腾讯云没有直接相关的产品和链接地址可提供,因为腾讯云主要是提供云计算基础设施和服务,与Android开发中的窗口管理和自定义组件无直接关联。但是腾讯云可以作为后端云服务平台,提供数据存储、人工智能等相关服务,供Android应用后端开发使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 悬浮窗开发设计实践

    Android显示系统分为3层UI框架层:负责管理窗口中View组件的布局与绘制以及响应用户输入事件WindowManagerService层:负责管理窗口Surface的布局与次序SurfaceFlinger...,它负责窗口的启动、添加和删除。...而Android 8.0对系统和API行为做了修改,包括使用SYSTEM_ALERT_WINDOW权限的应用无法再使用一下窗口类型来在其他应用和窗口上方显示提醒窗口:如果需要实现在其他应用和窗口上方显示提醒窗口...如果在Android 8.0以上版本仍然使用TYPE_PHONE类型的悬浮窗口,则会出现如下异常信息:android.view.WindowManager$BadTokenException: Unable...view避免重复添加(如果已经添加则首先要移除),然后销毁的时候把FloatWindow各种属性设置成null清理6.2 稳定性设计如何避免窗口移动,移动后松手的瞬间触发了点击事件首先设置一个布尔标记

    2.4K40

    必要掌握!Window、WindowManager !

    一般需要开启此标记,否则其他window不能收到事件。 FLAG_SHOW_WHEN_LOCKED,开启后 可以让window显示在锁屏的界面上。 type参数表示window的类型。...Manifest申请该权限是无效的。) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ if (!...使用中是通过WindowManager对的操作,无法直接访问window。下面就看看WindowManager的三个方法。...WindowManagerService主要作用: 窗口管理:是先进行窗口的权限检查,因为系统窗口需要声明权限,然后根据相关的Display信息以及窗口信息对窗口进行校对,再然后获取对应的WindowToken...,再根据不同的窗口类型检查窗口的有效性,如果上面一系列步骤都通过了,就会为该窗口创建一个WindowState对象,以维护窗口的状态和根据适当的时机调整窗口状态,最后就会通过WindowState的attach

    1.6K30

    Android悬浮窗的实现(易错点)

    而Android 8.0对系统和API行为做了修改,包括使用SYSTEM_ALERT_WINDOW权限的应用无法再使用一下窗口类型来在其他应用和窗口上方显示提醒窗口: – TYPE_PHONE...如果在Android 8.0以上版本仍然使用TYPE_PHONE类型的悬浮窗口,则会出现如下异常信息: android.view.WindowManager$BadTokenException: Unable...不过基础的原理是已经实现了,剩下的就是要在这上面一点点的添加功能啦。 3. 增加小功能 3.1 拖动功能   首先想要增加的功能就是能够拖动这个悬浮窗。...= null) { ((ImageView) displayView.findViewById(R.id.image_display_imageview)).setImageResource(images...3.3 视频小窗口   下面我们就来看看悬浮窗最常用的功能:视频小窗口。例如微信在视频过程中退出界面,就会以小窗口的形式来显示视频。

    3.4K10

    Android | 理解 Window 和 WindowManager

    PhoneWindow 中的 DecorView 最终也是附加到 Window(窗口)上面的。 因为在最开始的时候经常把二者搞混,Window 即是 View 管理者,也是窗口,显然是不合理的。...Window 显示的特性,例如: Floags 特性 FLAG_NOT_FOCUSABLE 表示 Window 不需要获取焦点,也不需要各种输入事件,此标记通同时启用 FLAG_NOT_TOUCH_MODAL...在实际开发中无法直接访问 Window,对 Window 访问必须通过 WindowManager Window 的添加过程 Window 的添加需要通过 WindowManager 的 addView...$BadTokenException: Unable to add window -- token null is not valid; is your activity running?...Toast 属于系统 Window,内部视图有两种定义方式,一种是系统默认的,另一种是通过 setView 方法来指定一个 View(setView 方法在 android 11 以后已经废弃了,不会再展示自定义视图

    89720

    Android Hook技术详解

    这里,我们就找到hook点了就是mInstrumentation,我们只要自定义一个instrumentation替换掉即可,下面贴下代码,代码中都有注释,原理懂了,代码理解起来就很方便了。...工具类:FieldUtil.java 自定义instruction:ProxyInstrumentation.java controll操作类:HookUtil.java 然后Application...在WindowManager要添加这个Toast的时候会去校验这个token,如果token有效,则添加窗口无效则报crash。...通常情况下是不会出现这个问题的,但是在某种情况下Android 进程某个 UI 线程的某个消息阻塞,导致toast.show()方法一直无法被调用,这个的同时NotificationManager的超时检测结束...=TYPE_TOAST的类型的toast不能重复添加,所以这样也会报一个BadTokenException,接下来我们就要通过这个demo,用hook的解决方案来解决这个异常。

    3.5K60

    Android知识点

    但是如果遇到对象嵌套,譬如 if(object.child == null) 的情况,如果一开始 object 就是个 null 对象,可想而知程序在执行条件语句判断时就会报 NullPointerException...例如在activity的onCreate方法里面调用popupwindow的show方法,有可能由于activity没有完全初始化导致程序异常(android.view.WindowManager$BadTokenException...在ScrollView中添加一个Android:fillViewport="true"属性就可以了。顾名思义,这个属性允许 ScrollView中的组件去充满它。...当无法通过搜索解决问题的时候,读源码是最快的解决思路。千万不要瞎猜和尝试随缘写代码来解决问题。...mMyWalletPresenter.reqRanking(position);//[2周排行,1总排行] } } CardView 使用android:background设置背景颜色无效

    67110

    Android窗口管理分析(3):窗口分组及Z-order的确定总结

    窗口的Z次序管理:窗口的分配序号、次序调整等 WMS中窗口次序分配如何影响SurfaceFlinger服务 在WMS窗口添加一文中分析过,窗口添加是通过WindowManagerGlobal.addView...android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application...--关键点1,必须找到子窗口的父窗口,否则添加失败--> WindowState attachedWindow = null; if (type >= FIRST_SUB_WINDOW...--关键点2 如果Activity第一次添加窗口 ,子窗口分组对应的WindowToken一定是null--> boolean addToken = false; WindowToken...Z order.jpg 前面分析了窗口分组的时候涉及了两个对象WindowState与Windtoken,但仅限分组,分组无法决定窗口的显示的Z-order,那么再WMS是怎么管理所有窗口的Z-order

    2.7K50

    【错误记录】Java AWT 图形界面编程问题 ( 组件按照布局要求设置后无法显示等各种问题 )

    ---- 先显示 Dialog 对话框 , 然后根据操作需求生成指定数量的组件 , 显示在对话框中 ; 动态添加组件后 , 发现添加组件无法显示 ; 最后发现需要在添加后 , 调用一次 Frame...#setVisibility(true) 方法 , 设置以下窗口的可见性 , 最终才能将动态添加组件更新上去 ; 只要组件发生了改动 , 就调用一次 Frame#setVisibility(true)...窗口设置组件位置失效 ---- 在 Frame 窗口 中设置组件 的位置和大小 , 发现设置无效 ; 最终发现 Frame 窗口的默认布局是 BorderLayout , 默认添加组件添加在中心的 ,...默认填充整个 CENTER 区域 ; 如果想要在窗口中精确控制某个组件或容器的显示位置和大小 , 那么就要取消 Frame 窗口的默认布局 , 调用 Frame#setLayout(null) 取消布局...容器中 , 向其中添加组件默认填充整个布局 , 这里需要设置大小来限制布局 ; 使用 Component#setSize 设置的大小是无效的 ; 必须使用 Component#setMaximumSize

    65810

    Android Toast自定义显示时间

    常规使用方法这里不做说明,继前一篇博客《Android中Toast全屏显示》 ,其中抛砖引玉的给出一个简单的实现Toast全屏显示的方法后,发现无法控制Toast的显示时长。...2、利用WindowManager的addView()方法动态刷屏,可看见博客《Android自定义Toast,可设定显示时间》 。...该方法被很多软件用来显示浮动窗口和图片的动态悬浮效果,如360手机软件和一些手游软件。在Android4.0上是一种不错的选择。当然,对于遇到系统默认把悬浮窗口功能关闭的手机,这招可能就不灵了。...通过分析Toast的显示原理和弹窗控制逻辑,本人借助Handler和Runnable机制,也成功实现了对Toast显示任意自定义时长。...android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.WindowManager

    2.9K31

    Window源码分析之Activity篇

    前言 Window表示一个窗口的概念,在日常开发中直接接触Window的机会并不多,但是在某些特殊时候我们需要在桌面上显示一个类似悬浮窗的东西,那么这种效果就需要用到Window来实现...是一个抽象类,具体的实现是PhoneWindow; android系统中,每个界面,对应着一个Window;但其实在android系统中Window也是一个抽象的概念,它是以View的形式存在;在使用中, 无法直接访问...是没有parentWindow的 return new WindowManagerImpl(mDisplay, parentWindow); } 第四步 Window时我们看见的窗口.... // 调用 WMS添加window, 并返回一个结果 用于判定添加的结果 res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes...; case WindowManagerGlobal.ADD_NOT_APP_TOKEN: throw new WindowManager.BadTokenException

    67740

    Android 复习笔记 —— 扒一扒 Context

    mBase.getResources(); } ...... } 这是一个典型的 装饰者模式,也叫做 修饰模式,以下来自维基百科: 修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式...就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。 通过使用修饰模式,可以在运行时扩充一个类的功能。...注意 attach() 方法中的 setWindowManager() 方法中的 mToken 参数,这决定了 Application Context 无法创建和显示 Dialog 。...这里并不是直接返回原生的 ContextImpl 对象,而是调用 context.getReceiverRestrictedContext() 返回一个 受限制 的 ReceiverRestrictedContext,你无法使用这个...使用 Application 的 Context 创建 Dialog 并显示,会报如下错误: Caused by: android.view.WindowManager$BadTokenException

    48210

    android toast显示时间,Android Toast自定义显示时间「建议收藏」

    常规使用方法这里不做说明,继前一篇博客《Android中Toast全屏显示》 ,其中抛砖引玉的给出一个简单的实现Toast全屏显示的方法后,发现无法控制Toast的显示时长。...2、利用WindowManager的addView()方法动态刷屏,可看见博客《Android自定义Toast,可设定显示时间》 。...该方法被很多软件用来显示浮动窗口和图片的动态悬浮效果,如360手机软件和一些手游软件。在Android4.0上是一种不错的选择。当然,对于遇到系统默认把悬浮窗口功能关闭的手机,这招可能就不灵了。...通过分析Toast的显示原理和弹窗控制逻辑,本人借助Handler和Runnable机制,也成功实现了对Toast显示任意自定义时长。...android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.WindowManager

    2.7K20

    Android View源码解读:浅谈DecorView与ViewRootImpl

    前言 对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制、测量、布局、绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解、研究。...= null && !...至于该一系列过程是怎样的,因为涉及到了很多机制,这里简单说明一下: 将DecorView添加至Window 每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口。...每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图。上文分析了创建DecorView的过程,现在则要把DecorView添加到Window对象中。...root.setView(view, wparams, panelParentView); // 2 } catch (RuntimeException e) { // BadTokenException

    68620
    领券