Android WindowManager 窗口泄漏的解决记录

Android N中SurfaceView泄露的问题分析 最近遇到一个bug,现象为SurfaceView的Layer没有销毁,导致屏幕上一直显示该Layer。觉得该案例有点意思,故在此记录下分析过程及解决方法,供有一定framework基础的Rom开发人员参考。 现象 分析过程 首先最直接相关的模块是SurfaceFlinger,既然能看到,应该存在该Layer并且进行了合成,否则这里就有问题,用如下命令dump状态信息: 阅读详情

12-13 17:05:58.037 27429-27429/com.android E/WindowManager: android.view.WindowLeaked: Activity com..android.ui.MainActivity has leaked window android.widget.TextView{42dd1c38 I.ED.... ......I. 0,0-140,155} that was originally added here                                                                                            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368)                                                                                            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:249)                                                                                            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)                                                                                            at com.iwoncloud.familyface.client.android.ui.contacts.fragment.ContactsFragment.onCreateView(ContactsFragment.java:71)                                                                                            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)                                                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)                                                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)                                                                                            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)                                                                                            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)                                                                                            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)                                                                                            at android.os.Handler.handleCallback(Handler.java:733)                                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)                                                                                            at android.os.Looper.loop(Looper.java:136)                                                                                            at android.app.ActivityThread.main(ActivityThread.java:5111)                                                                                            at java.lang.reflect.Method.invokeNative(Native Method)                                                                                            at java.lang.reflect.Method.invoke(Method.java:515)                                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)                                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)

                                                                                            at dalvik.system.NativeStart.main(Native Method)

Android.view.WindowLeaked按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢?

产生原因:
1.我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,所以当某个Dialog或者某个PopupWindow正在显示的时候我们去finish()了承载该Dialog(或PopupWindow)的Activity时,就会抛Window Leaked异常了,因为这个Dialog(或PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了。

2.还有一种情况就是下面代码,来创建窗口渲染的时候(本人遇到这种情况)

我们在做UI相关的代码时有时候会碰到WindowLeak,也就是所谓的窗体泄露,泄露的原因是因为androidUI操作在主线程中操作,但是我们会需要在一些线程或者异步任务中操作UI界面元素的需求,那么这个时候可能会出现类似问题。我在做浮动窗口的时候碰到了这个问题,浮动窗口需要用到WindowManager,windowManger又是一个activity的一个变量,它依存于Activity,当横竖屏切换或者activity销毁的时候这个变量会销毁。销毁的时候导致windowmanager通过AddView()方法添加的View没有依存,导致窗体泄露。那么问题来了,为什么这里会泄露了?

TextView mDialogText = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.list_position, null);
WindowManager mWindowManager = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mDialogText, lp);





解决方法:
1.关闭(finish)某个Activity前,要确保附属在上面的Dialog或PopupWindow已经关闭(dismiss)了。

2.解决方法:在onDestroy()里面调用了removeView方法,想要避免窗体泄露,但是这个方法并不管用,后来换成removeViewImmediate()就解决了这个问题,原因就是两个方法设计到线程同步问题,removeViewImmediate()是通知View立刻调用View.onDetachWindow(),这说明这个方法是通过一个监听或者观察者来实现的,因为线程的同步跟异步问题导致activity销毁了,但view还没有被remove完,于是就产生了所谓的窗体泄露。说到这里,我想大家也能明白这两个方法的区别了。


@Override
public void onDestroy() {
    super.onDestroy();
    if (mWindowManager != null) {
        mWindowManager.removeViewImmediate(mDialogText);
    }
}








android 


WindowManager


removeView(View v)


removeViewImmediate(View v)的区别

Android窗口化桌面实现:WindowManager与属性动画实战 在Android开发中,窗口管理和动画系统是构建复杂交互界面的核心技术。窗口作为UI的容器,通过WindowManager进行创建、管理和层级控制,而属性动画则提供了平滑过渡的视觉反馈。这些技术的工程价值在于能够突破传统Activity的全屏限制,实现多任务并存的灵活UI容器,广泛应用于悬浮球、画中画、快捷工具箱等场景。本文聚焦于Android桌面窗口化与动画实现,通过WindowManager创建可移动缩放的浮动窗口,并结合属性动画为窗口操作添加流畅的视觉反馈,为开发者深入理解系统UI底层逻辑提供了实践案 阅读详情

相关推荐

Unity开发Android桌面悬浮窗精灵:透明Activity与WindowManager实战

在移动应用开发中,混合开发技术结合了游戏引擎的丰富表现力与原生平台的系统级能力,为创新交互提供了可能。其核心原理在于通过跨平台引擎(如Unity)处理复杂图形渲染与逻辑,同时借助原生系统API(如Android的WindowManager)实现窗口管理与系统集成。这种技术方案的价值在于能够突破传统应用边界,创建常驻、可交互的系统级组件,广泛应用于桌面小工具、动态壁纸、品牌营销互动等场景。本文聚焦于Unity与Android原生开发深度整合,通过透明背景Activity与系统悬浮窗机制,实现一个可常驻桌面的3

weixin_33858336的博客 296

android 内存泄漏、窗口泄漏、生命周期等相关问题,WindowManager: android.view.WindowLeaked: Activity has lea

近日,在整理项目并添加功能模块时,发现一个窗口泄漏问题,记录一下 问题描述:共有两个Activity:FirstActivity、SecondActivity, 在FirstActivity, startActivityForResult方式跳转到SecondActivity,然后在SecondActivity中获取一些值,然后在SecondActivity使用setResult 方式返回FirstActivity,在FirstActivity弹出一个popwindow来显示传入的值,然后就报错了,错误显示

Kstar_Ming的博客 750

Android悬浮窗开发全解析:从WindowManager原理到多ROM适配实战

在Android应用开发中,窗口管理是构建复杂交互界面的基础。WindowManager作为系统的核心服务,负责管理所有窗口的层级、位置和显示状态,其原理决定了视图如何呈现在屏幕上。理解WindowManager.LayoutParams的type、flags等关键参数,是控制窗口行为(如悬浮、焦点、触摸事件传递)的技术核心。这项技术的工程价值在于,它允许应用突破传统Activity的边界,实现全局性的快捷操作、信息展示或辅助工具,从而极大提升用户体验。其典型应用场景包括全局快捷按钮、实时信息悬浮窗、游戏辅

weixin_33881140的博客 324

Android窗体泄露问题解决

【问题起因】   竖屏的MainActivity中有个view是通过WindowManager addView添加上去(onWindowChanged中调用),在某个fragment是需要请求设置为横屏: getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);,这样MainActivity就会重建,即经历onPause - > onStop -> onDestory - >onCr

逍遥阁 1049

Unity透明背景桌面宠物开发:Android悬浮窗口实现全解析

在移动应用开发中,实现透明背景和悬浮窗口是增强用户体验的重要技术。其核心原理涉及图形渲染管线的颜色缓冲区管理与窗口系统的层级控制。通过调整摄像机清除标志和像素格式,开发者可以控制视图的透明度,这在游戏开发、AR应用和系统工具中具有广泛价值。具体到Android平台,需要结合Unity的渲染能力与原生窗口管理,处理触摸事件传递和性能优化等工程实践。本文聚焦Unity与Android Studio集成,详细解析了透明背景桌面宠物的实现链路,涵盖了从摄像机设置到窗口权限管理的完整解决方案,并针对常见问题提供了排查

weixin_30423977的博客 354

Android悬浮窗权限深度解析:从TYPE_APPLICATION_OVERLAY到SYSTEM_ALERT_WINDOW

在Android开发中,窗口管理系统通过WindowManager.LayoutParams的type属性定义不同层级的显示界面,其中系统级窗口如悬浮窗需要特殊权限。其核心原理在于Android权限模型的演进,特别是SYSTEM_ALERT_WINDOW权限从普通权限转变为危险权限后,应用必须动态请求用户授权。这一机制的技术价值在于平衡了功能实现与系统安全,防止恶意应用滥用悬浮窗干扰用户。常见的应用场景包括全局快捷操作、后台服务状态显示等需要覆盖在其他应用之上的界面。针对开发中常见的“permission

weixin_33671935的博客 699

安卓 android.view.WindowLeaked解决方法

一开始我在onDestroy()里面调用了removeView方法,想要移除这个View来避免窗体泄露,发现这个方法并不管用,后来换成removeViewImmediate()解决了这个问题,原因就是两个方法设计到线程同步问题,removeViewImmediate()是通知View立刻调用View.onDetachedFromWindow(),这说明这个方法是通过一个监听或者观察者来实现的,因为线程的同步跟异步问题导致activity销毁了,但view还没有被remove完,于是就产生了所谓的窗体泄露。

hnlgzb的专栏 1333

Android悬浮球从原理到实战:服务+WindowManager+权限全解析

在Android应用开发中,实现全局可用的悬浮球是常见且棘手的需求。其本质是将一个View通过WindowManager挂载到系统窗口层级,而生命周期则由前台服务(Foreground Service)来承载。理解这层关系,需要从窗口类型(如TYPE_APPLICATION_OVERLAY)、系统权限授权、以及服务与视图解耦设计入手。WindowManager负责视图的添加、更新与移除,服务负责后台存活与状态管理,悬浮窗权限则决定了能否跨应用显示。掌握这些基础概念,不仅能实现稳定的悬浮球,还能扩展出加速球、

weixin_33843947的博客 531

app应用内存分析

背景介绍 工作中需要用一个小窗口来滚动显示app中感兴趣的信息,原理是实现单例的信息窗口,持有消息队列,无限循环处理的客户端将感兴趣的消息加入到队列,信息显示窗口从队列里poll出队首消息显示,采用WindowManager.LayoutParams.TYPE_SYSTEM_ERROR结合ScrollView来实现。但是应用开始跑的时候很正常,过了一个突然就没了,日志中打印如下: [16:

seiyaaa的专栏 769

SurfaceView你所应该知道的事

SurfaceView你所应该知道的事

Android利用WindowManager实现悬浮窗

主要为大家详细介绍了Android利用WindowManager实现悬浮窗效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Android悬浮窗开发全解析:从权限申请到窗口管理实战

在Android应用开发中,窗口系统是构建用户界面的核心基础。通过WindowManager服务,开发者可以管理视图的层级、位置和显示状态,实现复杂的界面交互。这一机制的技术价值在于能够突破传统Activity的界面限制,创建全局可见的覆盖层,为应用提供更灵活的UI展示能力。其典型应用场景包括全局通知提醒、画中画视频播放、快捷操作面板等需要跨应用界面显示的功能。本文聚焦于实现这类功能的关键——悬浮窗开发,深入讲解SYSTEM_ALERT_WINDOW权限的申请流程、TYPE_APPLICATION_OVER

weixin_34060741的博客 448

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 326

【Android面试】窗口机制专题

android窗口机制

studyForMokey的博客 490

高通跃龙QCS6490部署yolov11_obb实战:QNN SDK工具链全解析与避坑指南

本文详细解析了在高通跃龙QCS6490平台上部署yolov11_obb模型的实战过程,重点介绍了QNN SDK工具链的使用与优化技巧。从环境配置、模型转换到性能调优,提供了全面的避坑指南和DSP加速配置建议,帮助开发者高效实现旋转框检测任务在边缘设备上的部署。

weixin_29232121的博客 303

NVIDIA Cosmos:生成式物理世界模型 从入门到精通1

Prompt Upsampler模型通过微调T5-XXL实现低质量描述到专业级描述的自动扩展,将"一个机器人在仓库"转换为"一台橙色的Kiva自主移动机器人在现代化电商仓库的过道中行驶,头顶的LED阵列投射出冷白色光线,地面反射出机器人的轮廓,摄像机以1.5米高度跟随拍摄,轻微晃动模拟手持效果"。控制输入(深度图、语义分割等)经独立的卷积编码器处理后注入控制分支,提取的多尺度特征通过零卷积层(zero convolution)逐步释放至主网络,避免初始训练阶段的噪声干扰。视频条件通过时序掩码控制扩散范围。

VectorShift的博客 134

Android窗口机制:核心概念与面试高频问题解析

窗口机制是Android系统显示架构的基础,涉及应用界面的绘制、事件分发和性能优化。其核心在于WindowManager、WindowManagerService(WMS)和ViewRootImpl的协同工作,通过Binder跨进程通信实现窗口管理。在技术实现上,窗口添加流程包括初始化、视图附加、WMS注册、绘制准备、合成提交和事件通路建立六个阶段。这一机制不仅影响UI渲染效率,还直接关系到触摸事件分发、多窗口适配等关键功能。在面试中,窗口层级关系、对话框覆盖原理和内存泄漏排查等成为高频考点。通过理解窗口机

weixin_32576389的博客 223

Oracle EBS PAC定期成本分配处理程序请求报错:30011一个无效帐户与正在处理的物料关联

Oracle EBS版本: RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 前提条件: 1、启用“MRP:调试模型”配置文件 月结会计反映执行《定期成本分配处理程序》请求报错: 中文:30011一个无效帐户与正在处理的物料关联。: CSTPALPC.create_dist_entry : 40 英文:30011An invalid account is associated with the item being transacted.:...

陈显平的专栏-Oracle EBS 1085

Android U自由窗口功能开发与优化指南

窗口管理是Android系统核心功能之一,通过WindowManagerService实现应用界面的层级控制。Android U引入的自由窗口功能重构了传统窗口栈模型,采用独立WindowContainer管理悬浮窗口,支持动态Z-order排序和跨窗口事件传递。这项技术显著提升大屏设备的多任务处理能力,在折叠屏、平板等设备上可实现视频会议+文档编辑等高效场景。开发时需注意SYSTEM_ALERT_WINDOW权限申请和WindowManager.LayoutParams参数配置,典型问题包括内存泄漏预防和

weixin_42531163的博客 284

基于Matlab的无迹卡尔曼滤波惯性导航与DVL组合导航

航天航空领域中的惯性导航是一种基于惯性测量单元(Inertial Measurement Unit,IMU)的导航方法,可以提供航向、速度和位置等信息。深度/速度测量器(Doppler Velocity Log,DVL)是一种常用的传感器,可用于测量水下航行器的速度。通过将DVL与无迹卡尔曼滤波相结合,可以实现高精度的组合导航。本文介绍了基于Matlab的无迹卡尔曼滤波(UKF)惯性导航与DVL组合导航的方法。以上是一种简化的示例代码,您可以根据实际应用需求进行相应的修改和优化。

DevSavantX的博客 416

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2369

AI Maestro生产环境运维与故障排查清单:pm2部署、日志轮转与常见问题速查

AI Maestro 是一个 AI Agent 编排与多 Agent 管理面板:它用 tmux 承载 Claude Code、Codex、Grok Build 等终端 AI Agent,通过实时 Web 终端统一查看、发消息、管理它们的整个生命周期。要把它当作**长期运行的生产服务**,核心就三件事:用 **pm2 守护进程**保证崩溃自动拉起、用**日志轮转**防止日志撑爆磁盘、按**资源规划*

gitblog_00685的博客 386

手把手教你学Simulink——逆变器场景:基于PR控制器的单相逆变器并网控制策略仿真

摘要:本文详细介绍基于PR控制器的单相逆变器并网控制策略的Simulink仿真实现。首先分析PR控制器在单相逆变应用中的优势,然后逐步讲解模型搭建过程,包括主电路设计(直流电源、全桥逆变器、L滤波器)、控制回路实现(参考电流生成、坐标变换、PR控制器设计)以及关键参数设置。通过仿真验证了PR控制器对电网频率的精确跟踪能力,并网电流THD<3%。最后提出优化建议,如加入状态观测器、自适应参数整定等改进方向。该建模方法为可再生能源系统中的逆变器控制提供了有效验证手段。

MHD0815的博客 497

Android Toast深度解析:从基础使用到源码机制与最佳实践

在Android应用开发中,用户反馈机制是提升交互体验的关键环节。Toast作为一种轻量级的全局提示组件,其核心原理是基于WindowManager的窗口系统,通过非阻塞方式在屏幕指定位置短暂显示信息。这一设计使其具备不依赖Activity生命周期、不中断用户操作的特性,在快速状态反馈场景中具有重要技术价值。理解Toast的线程安全要求、Context选择策略以及不同Android版本的行为差异,是避免常见崩溃和兼容性问题的关键。在实际开发中,Toast常与Handler、Looper等线程调度机制结合使用

weixin_34005042的博客 298

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4071

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android.view.WindowLeaked的解决办法 (记录一下)

来源: 按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而...

qq_43141190的博客 190

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Android 微信第三方登录(个人笔记)
下一篇: 关于导入BaiduLBS_Android.jar 出现的问题com/baidu/location/Address$1.class
丶Kevin_
博客等级 码龄14年 8粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值