WindowManagerService(WMS)标记管理。...但是我们的普通应用程序怎么能拥有添加系统窗口的权限呢?...WindowManager检查当前窗口的token是否有效,如果有效,则添加窗口展示Toast;如果无效,则抛出上述异常,Crash发生。 详细的原理图如下: ?...,用于对添加的窗口类型进行校验。...也是没有添加TYPE_TOAST权限的,最终还是无法避免这个异常的发生。
异常和偶尔不显示的问题 当你在程序中调用了 Toast 的 API,你可能会在后台看到类似这样的 Toast 执行异常: android.view.WindowManager$BadTokenException...WindowManagerImpl.java:94) android.widget.Toast$TN.handleShow(Toast.java:459) 另外,在某些系统上,你没有看到什么异常,却会出现 Toast 无法正常展示的问题...,并且添加到 WMS 管理 将该 Toast 请求记录成为一个 ToastRecord 对象 代码到这里,我们已经看出 Toast 是如何偷天换日的。...token 添加到 WMS 对象,并且类型是 TOAST NotificationManager 将这个窗口 token 通过 ITransientNotification 的 show 方法传递给远程的...当进程异常退出后我们截取他们的日志可以得到: 12-28 11:10:30.086 24599 24599 E AndroidRuntime: android.view.WindowManager$BadTokenException
image.png 2.1如果是在Android4.x的情况,只用在AndroidManifest.xml中添加权限: <!...image.png 不同的手机对应不同的api 会出现不同的悬浮窗问题,这是由于andriod系统导致的,看下你手机对应下图中的api等级 image.png 2.3 andriod8.0以上手机报错 android.view.WindowManager...$BadTokenException: Unable to add window android.view.ViewRootlmpl$W@40ec8528 -- permission denied for...TYPE_PHONE,这种类型是用于用户交互操作的非应用窗口, andriod8.0对系统和api行为做了修改,要实现在其他应用和窗口上方显示提醒窗口,必须为TYPE_APPLICATION_OVERLAY
,它负责窗口的启动、添加和删除。...而Android 8.0对系统和API行为做了修改,包括使用SYSTEM_ALERT_WINDOW权限的应用无法再使用一下窗口类型来在其他应用和窗口上方显示提醒窗口:如果需要实现在其他应用和窗口上方显示提醒窗口...如果在Android 8.0以上版本仍然使用TYPE_PHONE类型的悬浮窗口,则会出现如下异常信息:android.view.WindowManager$BadTokenException: Unable...view避免重复添加(如果已经添加则首先要移除),然后销毁的时候把FloatWindow各种属性设置成null清理6.2 稳定性设计如何避免窗口移动,移动后松手的瞬间触发了点击事件首先设置一个布尔标记值...(触摸移动标记),在手指按下去(ACTION_DOWN)的时候设置为false。
ContextImpl.java:944) W/System.err: at android.app.ContextImpl.startActivity(ContextImpl.java:931) 表示要添加一个...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
而Android 8.0对系统和API行为做了修改,包括使用SYSTEM_ALERT_WINDOW权限的应用无法再使用一下窗口类型来在其他应用和窗口上方显示提醒窗口: – TYPE_PHONE...如果在Android 8.0以上版本仍然使用TYPE_PHONE类型的悬浮窗口,则会出现如下异常信息: android.view.WindowManager$BadTokenException: Unable...不过基础的原理是已经实现了,剩下的就是要在这上面一点点的添加功能啦。 3. 增加小功能 3.1 拖动功能 首先想要增加的功能就是能够拖动这个悬浮窗。...3.3 视频小窗口 下面我们就来看看悬浮窗最常用的功能:视频小窗口。例如微信在视频过程中退出界面,就会以小窗口的形式来显示视频。...%20Treasure.mp4")); mediaPlayer.prepareAsync(); } catch (IOException e) { Toast.makeText(this, "无法打开视频源
在WindowManager要添加这个Toast的时候会去校验这个token,如果token有效,则添加窗口,无效则报crash。...通常情况下是不会出现这个问题的,但是在某种情况下Android 进程某个 UI 线程的某个消息阻塞,导致toast.show()方法一直无法被调用,这个的同时NotificationManager的超时检测结束...虽然没复现出来这个token is valid,但我在阅读Toast源代码后想到用另一种方式来复现这个BadTokenException: 先来看点击了按钮以后报的错误: 因为type=...=TYPE_TOAST的类型的toast不能重复添加,所以这样也会报一个BadTokenException,接下来我们就要通过这个demo,用hook的解决方案来解决这个异常。...通过一个final的Handler,所以就很简单了,我们hook点就定位这个mTN,然后反射替换TN的内部成员变量mHandler,从而添加try-catch做到保护即可。
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方法来完成。
PhoneWindow 中的 DecorView 最终也是附加到 Window(窗口)上面的。 因为在最开始的时候经常把二者搞混,Window 即是 View 管理者,也是窗口,显然是不合理的。...Window 显示的特性,例如: Floags 特性 FLAG_NOT_FOCUSABLE 表示 Window 不需要获取焦点,也不需要各种输入事件,此标记通同时启用 FLAG_NOT_TOUCH_MODAL...在实际开发中无法直接访问 Window,对 Window 访问必须通过 WindowManager Window 的添加过程 Window 的添加需要通过 WindowManager 的 addView...普通的 Dialog 有一个特殊的地方,就是必须采用 Activity 的 Context,如果采用 Application 的 Context,就会报错: Caused by: android.view.WindowManager...$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
由于本人是菜鸟,其实无法直接看源码,也都是通过书籍与文章反复阅读,然后才去看的源码。由于怕忘记写成博客。希望和我一样不了解的朋友能在自定义View中不那么迷茫。...---- DecorView添加到窗口过程 1.ActivityThread#performResumeActivity 上面我们已经了解了,Activity的布局加载过程,当我们加载布局完成后我们是如何将我们加载的布局添加到我们的界面窗口的呢...在这里将加载完成的DecorView添加到PhoneWindow窗口。...DecorView已经添加到窗口界面 a.mWindowAdded = true; //将DecorView添加到当前Activity...//标记已添加DecorView 默认为false mAdded = true; .............
1387 成员不存在,因此无法将其添加到本地组或从中删除。 1388 新成员的帐户类型有误,因此无法将其添加到本地组。 1389 指定的安全标识符太多。...1400 窗口句柄无效。 1401 菜单句柄无效。 1402 光标句柄无效。 1403 加速键表的句柄无效。 1404 挂接句柄无效。 1405 多重窗口位置结构句柄无效。...1406 无法创建最上层的子窗口。 1407 找不到窗口类。 1408 窗口无效;属于其他线程。 1409 已经注册热键。 1410 类已经存在。 1411 类不存在。...1441 多重窗口位置结构中所有窗口句柄必须具有相同的父窗口。 1442 窗口不是子窗口。 1443 GW_* 命令无效。 1444 线程标识符无效。...1925 无法添加指定的配置文件项。 1926 无法添加指定的配置文件元素。 1927 无法删除指定的配置文件元素。 1928 无法添加组元素。 1929 无法删除组元素。
Window Window即窗口,是个抽象类,具体实现就是PhoneWindow,对就是那个装着DecorView的PhoneWindow。...Uri.parse("package:"+getPackageName())); startActivity(intent); WindowManager View想要呈现出来,必须要通过Window,但是我们无法直接操作...* <p Throws {@link android.view.WindowManager.BadTokenException} for certain programming * errors...FLAG_NOT_FOCUSABLE:表示Window不需要获取焦点,也不需要接收各种输入事件,此标记会同时启用FLAG_NOT_TOUCH_MODAL,最终事件会直接传递给下层具有焦点的Window。
其实这里面就牵扯都Android的窗口组织管理形式,本文主要包含以下几点内容: 窗口的分组管理 :应用窗口组、子窗口组、系统窗口组 Activity、Dialg应用窗口及PopWindow子窗口的添加原理跟注意事项...窗口的Z次序管理:窗口的分配序号、次序调整等 WMS中窗口次序分配如何影响SurfaceFlinger服务 在WMS窗口添加一文中分析过,窗口的添加是通过WindowManagerGlobal.addView...这里先看一下type参数,之前曾添加过Toast窗口,它的type值是TYPE_TOAST,标识是一个系统提示窗口,下面先简单看下三种窗口类型的Type对应的值,首先看一下应用窗口 窗口TYPE值 窗口类型...android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application...Z order.jpg 前面分析了窗口分组的时候涉及了两个对象WindowState与Windtoken,但仅限分组,分组无法决定窗口的显示的Z-order,那么再WMS是怎么管理所有窗口的Z-order
例如在activity的onCreate方法里面调用popupwindow的show方法,有可能由于activity没有完全初始化导致程序异常(android.view.WindowManager$BadTokenException...在ScrollView中添加一个Android:fillViewport="true"属性就可以了。顾名思义,这个属性允许 ScrollView中的组件去充满它。...当无法通过搜索解决问题的时候,读源码是最快的解决思路。千万不要瞎猜和尝试随缘写代码来解决问题。...void updateDrawState(TextPaint ds) { ds.setUnderlineText(false);//去掉下划线 //给标记的部分...mMyWalletPresenter.reqRanking(position);//[2周排行,1总排行] } } CardView 使用android:background设置背景颜色无效
前言 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
知识兔我们正在为SketchUp及其应用程序套件添加新标记。知识兔这意味着SketchUp,LayOut,3D模型库,知识兔扩展模型仓库和样式生成器的新应用程序图标,知识兔以及一些修改后的工具栏图标。...这些新标记知识兔使SketchUp与Trimble产品的更广泛的产品组合对齐,并且知识兔…它们可以在SketchUp中建模!稳定性修复了导入某些知识兔.dem文件时崩溃的问题。...修复了“跟随我”工具无法按知识兔预期清理几何的问题。修复了状态栏不会为“选择知识兔”工具显示键修改器文本的问题。修复了卷尺测量工具的问题,知识兔在该问题中,按快捷键会导致向导状态意外更改。...发现无效的组件关系时,知识兔添加了新的有效性检查。当尺寸标注使用无效字体时,知识兔添加了新的有效性检查。添加了一个修复程序,用于在知识兔模型错误检查发现北方向无效时将北方向设置为绿色轴。...在“模型信息”窗口的“文知识兔件”信息中删除了“版本”字段。修复了相同的水印名称不知识兔能由不同样式共享的问题。
该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。 ...如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送 WM_ERASEBKGND 和 WM_NCPAINT 给窗口过程处理函数。 ...lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。 ...bErase:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。当指定TRUE时需要重画。 返回值: 函数成功则返回非零值,否则返回零值。 ...说明:被标记为无效矩形的区域直到WM_PAINT消息被处理完之后才会消失,或者使用ValidateRect(),ValidateRgn()函数来使之有效。
隐藏标题栏 隐藏标题栏比较简单,只需要在MainActivity中的onCreate下添加 ActionBar actionBar = getActionBar(); if (actionBar...' 添加完记得 Sync Now一下。...android.graphics.Color; import android.os.Build; import android.view.View; import android.view.Window; import android.view.WindowManager...} /** * 设置状态栏图标为深色和魅族特定的文字风格 * 可以用来判断是否为Flyme用户 * * @param window 需要设置的窗口...Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错
通常,界面报错有三种典型情况: 应用无法完成用户要求的操作(比如运用本身不具备某项功能或没有某项技术支持时) 应用无法理解用户的输入(或输入无效) 用户尝试大幅简化需要更多不走的复杂操作(...这是在ArtStation标记注册错误的方法:系统用红色标记该字段,并用文本进行提示。 3....不要添加多余操作 一些交互设计师会把不同的错误放在单独的页面或弹出窗口中,尽管这样的方式有其优势,也足够显眼,但过度使用的话就会产生极大的副作用。...在大多数情况下,其实只需要在交互区域中创建一个颜色对比标记就足够了,使用消息框则显得臃肿繁琐,用户还要再次点击才能回到页面。想象一下,如果你正在填写注册表,然后弹出了错误提示窗口,是不是很多余?...但是,如果由于错误而需要将用户重定向到另一个页面,这时候就需要使用弹出窗口了。 当用户遗漏添加邮箱提交表单时的报错设计: 5.
领取专属 10元无门槛券
手把手带您无忧上云