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

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

5.9K182
您找到你想要的搜索结果了吗?
是的
没有找到

悬浮窗开发设计实践

,它负责窗口的启动、添加和删除。...而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。

2.3K40

必要掌握!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.5K30

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

而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, "无法打开视频源

3.1K10

Android Hook技术详解

在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做到保护即可。

3.3K60

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...普通的 Dialog 有一个特殊的地方,就是必须采用 Activity 的 Context,如果采用 Application 的 Context,就会报错: Caused by: android.view.WindowManager...$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

76720

Windows错误码大全error code

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 无法删除组元素。

9.6K10

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

其实这里面就牵扯都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

2.4K50

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

63240

Sketchup pro 2021 Mac 草图大师2022激活版下载

知识兔我们正在为SketchUp及其应用程序套件添加标记。知识兔这意味着SketchUp,LayOut,3D模型库,知识兔扩展模型仓库和样式生成器的新应用程序图标,知识兔以及一些修改后的工具栏图标。...这些新标记知识兔使SketchUp与Trimble产品的更广泛的产品组合对齐,并且知识兔…它们可以在SketchUp中建模!稳定性修复了导入某些知识兔.dem文件时崩溃的问题。...修复了“跟随我”工具无法按知识兔预期清理几何的问题。修复了状态栏不会为“选择知识兔”工具显示键修改器文本的问题。修复了卷尺测量工具的问题,知识兔在该问题中,按快捷键会导致向导状态意外更改。...发现无效的组件关系时,知识兔添加了新的有效性检查。当尺寸标注使用无效字体时,知识兔添加了新的有效性检查。添加了一个修复程序,用于在知识兔模型错误检查发现北方向无效时将北方向设置为绿色轴。...在“模型信息”窗口的“文知识兔件”信息中删除了“版本”字段。修复了相同的水印名称不知识兔能由不同样式共享的问题。

1.2K10

VC++ InvalidateRect

该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。   ...如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送 WM_ERASEBKGND 和 WM_NCPAINT 给窗口过程处理函数。   ...lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。   ...bErase:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。当指定TRUE时需要重画。   返回值:   函数成功则返回非零值,否则返回零值。   ...说明:被标记无效矩形的区域直到WM_PAINT消息被处理完之后才会消失,或者使用ValidateRect(),ValidateRgn()函数来使之有效。

1.6K10

搞定UI中报错信息设计,轻松提升用户体验

通常,界面报错有三种典型情况: 应用无法完成用户要求的操作(比如运用本身不具备某项功能或没有某项技术支持时) 应用无法理解用户的输入(或输入无效) 用户尝试大幅简化需要更多不走的复杂操作(...这是在ArtStation标记注册错误的方法:系统用红色标记该字段,并用文本进行提示。 3....不要添加多余操作 一些交互设计师会把不同的错误放在单独的页面或弹出窗口中,尽管这样的方式有其优势,也足够显眼,但过度使用的话就会产生极大的副作用。...在大多数情况下,其实只需要在交互区域中创建一个颜色对比标记就足够了,使用消息框则显得臃肿繁琐,用户还要再次点击才能回到页面。想象一下,如果你正在填写注册表,然后弹出了错误提示窗口,是不是很多余?...但是,如果由于错误而需要将用户重定向到另一个页面,这时候就需要使用弹出窗口了。 当用户遗漏添加邮箱提交表单时的报错设计: 5.

1.7K20
领券