但是我们的普通应用程序怎么能拥有添加系统窗口的权限呢?...WindowManager检查当前窗口的token是否有效,如果有效,则添加窗口展示Toast;如果无效,则抛出上述异常,Crash发生。 详细的原理图如下: ?...valid,这个异常堆栈如下: android.view.WindowManager$BadTokenException: Unable to add window -- token null is...,用于对添加的窗口类型进行校验。...也是没有添加TYPE_TOAST权限的,最终还是无法避免这个异常的发生。
; } } 5.java.lang.reflect.InvocationTargetException xml中引用的自定义的view出错导致的 6.java.lang.IllegalStateException...7. android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application...i) 在MyApplication.java里面添加了弹框操作。 ...8. java.lang.NullPointerException 1).自定义view的时候在ondraw方法中最后一次参数穿了null.就像下面的代码。就会报空指针。...canvas.drawCircle(getWidth() / 2, getHeight() / 2, mRadius, null); 改正方法只需new一个paint对象传进去就好了
异常和偶尔不显示的问题 当你在程序中调用了 Toast 的 API,你可能会在后台看到类似这样的 Toast 执行异常: android.view.WindowManager$BadTokenException...WindowManagerImpl.java:94) android.widget.Toast$TN.handleShow(Toast.java:459) 另外,在某些系统上,你没有看到什么异常,却会出现 Toast 无法正常展示的问题...= null) { ......token 添加到 WMS 对象,并且类型是 TOAST NotificationManager 将这个窗口 token 通过 ITransientNotification 的 show 方法传递给远程的...当进程异常退出后我们截取他们的日志可以得到: 12-28 11:10:30.086 24599 24599 E AndroidRuntime: android.view.WindowManager$BadTokenException
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 稳定性设计如何避免窗口移动,移动后松手的瞬间触发了点击事件首先设置一个布尔标记值
ContextImpl.java:944) W/System.err: at android.app.ContextImpl.startActivity(ContextImpl.java:931) 表示要添加一个...spinner. 5.在service里调用progressDialog.show()方法时,会出现异常 如果没有将progress设为可悬浮在其它应用上方,并设置相应的权限,那么在service等其它组件中调用...dialog.show()时,会无法获得当前windows,故无法正常显示dialog....W/System.err: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not
一般需要开启此标记,否则其他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
这里,我们就找到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的解决方案来解决这个异常。
而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 视频小窗口 下面我们就来看看悬浮窗最常用的功能:视频小窗口。例如微信在视频过程中退出界面,就会以小窗口的形式来显示视频。
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 以后已经废弃了,不会再展示自定义视图
Window 机制深入源码分析 Window 是一个抽象的基类,表示一个窗口,包含一个View tree和layout参数。...在实际中无法直接访问,需要通过WindowManager这个应用程序窗口管理器进行访问。...root.setView(view, wparams, panelParentView); } catch (RuntimeException e) { // BadTokenException... case WindowManagerGlobal.ADD_APP_EXITING: throw new WindowManager.BadTokenException...Window的添加过程最后统统交给了WindowManagerService的addWindow方法来完成。
由于本人是菜鸟,其实无法直接看源码,也都是通过书籍与文章反复阅读,然后才去看的源码。由于怕忘记写成博客。希望和我一样不了解的朋友能在自定义View中不那么迷茫。...---- DecorView添加到窗口过程 1.ActivityThread#performResumeActivity 上面我们已经了解了,Activity的布局加载过程,当我们加载布局完成后我们是如何将我们加载的布局添加到我们的界面窗口的呢...在这里将加载完成的DecorView添加到PhoneWindow窗口。...DecorView已经添加到窗口界面 a.mWindowAdded = true; //将DecorView添加到当前Activity...//标记已添加DecorView 默认为false mAdded = true; .............
但是如果遇到对象嵌套,譬如 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设置背景颜色无效
窗口的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
---- 先显示 Dialog 对话框 , 然后根据操作需求生成指定数量的组件 , 显示在对话框中 ; 动态添加组件后 , 发现添加的组件都无法显示 ; 最后发现需要在添加后 , 调用一次 Frame...#setVisibility(true) 方法 , 设置以下窗口的可见性 , 最终才能将动态添加的组件更新上去 ; 只要组件发生了改动 , 就调用一次 Frame#setVisibility(true)...窗口设置组件位置失效 ---- 在 Frame 窗口 中设置组件 的位置和大小 , 发现设置无效 ; 最终发现 Frame 窗口的默认布局是 BorderLayout , 默认添加组件是添加在中心的 ,...默认填充整个 CENTER 区域 ; 如果想要在窗口中精确控制某个组件或容器的显示位置和大小 , 那么就要取消 Frame 窗口的默认布局 , 调用 Frame#setLayout(null) 取消布局...容器中 , 向其中添加的组件默认填充整个布局 , 这里需要设置大小来限制布局 ; 使用 Component#setSize 设置的大小是无效的 ; 必须使用 Component#setMaximumSize
这需要在 DialogFragment 的视图创建和显示过程中配置窗口属性。...自定义 FullScreenDialog.kt import android.app.Dialog import android.content.Context import android.os.Bundle...import android.view.View import android.view.Window import android.view.WindowManager class FullScreenDialog...let { … }: 为了确保 window 不为 null,使用 Kotlin 的安全调用操作符 ?. 来使用窗口对象。 setLayout 方法将对话框设置为全屏。...如果需要在更多场景下多次使用该样式,可以进一步将其封装或抽取为一个通用组件。
常规使用方法这里不做说明,继前一篇博客《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
前言 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
mBase.getResources(); } ...... } 这是一个典型的 装饰者模式,也叫做 修饰模式,以下来自维基百科: 修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式...就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。 通过使用修饰模式,可以在运行时扩充一个类的功能。...注意 attach() 方法中的 setWindowManager() 方法中的 mToken 参数,这决定了 Application Context 无法创建和显示 Dialog 。...这里并不是直接返回原生的 ContextImpl 对象,而是调用 context.getReceiverRestrictedContext() 返回一个 受限制 的 ReceiverRestrictedContext,你无法使用这个...使用 Application 的 Context 创建 Dialog 并显示,会报如下错误: Caused by: android.view.WindowManager$BadTokenException
知识兔我们正在为SketchUp及其应用程序套件添加新标记。知识兔这意味着SketchUp,LayOut,3D模型库,知识兔扩展模型仓库和样式生成器的新应用程序图标,知识兔以及一些修改后的工具栏图标。...修复了“跟随我”工具无法按知识兔预期清理几何的问题。修复了状态栏不会为“选择知识兔”工具显示键修改器文本的问题。修复了卷尺测量工具的问题,知识兔在该问题中,按快捷键会导致向导状态意外更改。...发现无效的组件关系时,知识兔添加了新的有效性检查。当尺寸标注使用无效字体时,知识兔添加了新的有效性检查。添加了一个修复程序,用于在知识兔模型错误检查发现北方向无效时将北方向设置为绿色轴。...当发现/修复了一些无效的组件知识兔关系时,启用了新的有效性检查。修复了在打开模型时进行有效性知识兔检查之后,“撤消检查有效性”选项不可用的问题。...在“模型信息”窗口的“文知识兔件”信息中删除了“版本”字段。修复了相同的水印名称不知识兔能由不同样式共享的问题。
领取专属 10元无门槛券
手把手带您无忧上云