在activity里边创建AlertDialog并显示它,此时转屏,发现对话框会消失,Activity会被重新创建。
即:
onCreate -> onStart-> onResume ->旋转 -> onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume

效果看起来很好,但是从log,发现似乎发生溢出。

05-12 10:05:34.418 11242 11242 D TAG     : getProp: unknown
05-12 10:05:34.442 11242 11289 D Surface : Surface::disconnect(this=0x71ce5cb000,api=1)
05-12 10:05:34.449 11242 11242 D View    : [Warning] assignParent to null: this = DecorView@459eb07[MainActivity]
05-12 10:05:34.465 11242 11242 E WindowManager:
05-12 10:05:34.465 11242 11242 E WindowManager: android.view.WindowLeaked: Activity dsfingerprint.dy.txx.com.dsfingerprint.MainActivity has leaked window DecorView@687d778[MainActivity] that was originally added here
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:614)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.app.Dialog.show(Dialog.java:342)
05-12 10:05:34.465 11242 11242 E WindowManager:     at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1009)
05-12 10:05:34.465 11242 11242 E WindowManager:     at dsfingerprint.dy.txx.com.dsfingerprint.MainActivity.BtnOnClick(MainActivity.java:252)
05-12 10:05:34.465 11242 11242 E WindowManager:     at java.lang.reflect.Method.invoke(Native Method)
05-12 10:05:34.465 11242 11242 E WindowManager:     at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.View.performClick(View.java:7150)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.View.performClickInternal(View.java:7123)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.View.access$3500(View.java:807)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.view.View$PerformClick.run(View.java:27540)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.os.Handler.handleCallback(Handler.java:883)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:100)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.os.Looper.loop(Looper.java:214)
05-12 10:05:34.465 11242 11242 E WindowManager:     at android.app.ActivityThread.main(ActivityThread.java:7554)
05-12 10:05:34.465 11242 11242 E WindowManager:     at java.lang.reflect.Method.invoke(Native Method)
05-12 10:05:34.465 11242 11242 E WindowManager:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
05-12 10:05:34.465 11242 11242 E WindowManager:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
05-12 10:05:34.467 11242 11289 D Surface : Surface::disconnect(this=0x71d37ed000,api=1)
05-12 10:05:34.469 11242 11242 D View    : [Warning] assignParent to null: this = DecorView@687d778[MainActivity]

原因是,AlertDialog需要依附于Activity而存在,此时Activity被销毁,AlertDialog却未被dismiss,导致其依赖的上下文不存在。无法回收。

05-12 10:28:25.159 13004 13004 D TAG     : onPause: alertDialog.isShowing():true
05-12 10:28:25.165 13004 13004 D TAG     : onStop: alertDialog.isShowing():true
05-12 10:28:25.169 13004 13004 D TAG     : onDestroy: alertDialog.isShowing():true
05-12 10:28:25.182 13004 13057 D Surface : Surface::disconnect(this=0x71ce760000,api=1)
05-12 10:28:25.184 13004 13004 D View    : [Warning] assignParent to null: this = DecorView@459eb07[MainActivity]
05-12 10:28:25.205 13004 13004 E WindowManager:
05-12 10:28:25.205 13004 13004 E WindowManager: android.view.WindowLeaked: Activity dsfingerprint.dy.txx.com.dsfingerprint.MainActivity has leaked window DecorView@687d778[MainActivity] that was originally added here
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:614)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.app.Dialog.show(Dialog.java:342)
05-12 10:28:25.205 13004 13004 E WindowManager:     at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1009)
05-12 10:28:25.205 13004 13004 E WindowManager:     at dsfingerprint.dy.txx.com.dsfingerprint.MainActivity.BtnOnClick(MainActivity.java:255)
05-12 10:28:25.205 13004 13004 E WindowManager:     at java.lang.reflect.Method.invoke(Native Method)
05-12 10:28:25.205 13004 13004 E WindowManager:     at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.View.performClick(View.java:7150)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.View.performClickInternal(View.java:7123)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.View.access$3500(View.java:807)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.view.View$PerformClick.run(View.java:27540)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.os.Handler.handleCallback(Handler.java:883)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:100)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.os.Looper.loop(Looper.java:214)
05-12 10:28:25.205 13004 13004 E WindowManager:     at android.app.ActivityThread.main(ActivityThread.java:7554)
05-12 10:28:25.205 13004 13004 E WindowManager:     at java.lang.reflect.Method.invoke(Native Method)
05-12 10:28:25.205 13004 13004 E WindowManager:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
05-12 10:28:25.205 13004 13004 E WindowManager:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
05-12 10:28:25.207 13004 13057 D Surface : Surface::disconnect(this=0x71ce930000,api=1)
05-12 10:28:25.209 13004 13004 D View    : [Warning] assignParent to null: this = DecorView@687d778[MainActivity]
05-12 10:28:25.393 13004 13004 D TAG     : onCreate:
05-12 10:28:25.408 13004 13004 D knealq  : onResume: i:1

解决办法:
在销毁Activity之前,主动将Alertdialog dismiss。

    protected void onPause() {super.onPause();if(null != alertDialog && alertDialog.isShowing()){Log.d("TAG", "onPause: alertdialog showing, dismiss it");alertDialog.dismiss();}}

再看log,不再报leak window了:

05-12 10:18:11.978 12708 12708 D TAG     : getProp: unknown
05-12 10:18:11.979 12708 12708 D TAG     : onPause: alertdialog showing, dismiss it
05-12 10:18:11.986 12708 12757 D Surface : Surface::disconnect(this=0x7170e7a000,api=1)
05-12 10:18:11.988 12708 12708 D View    : [Warning] assignParent to null: this = DecorView@58f3ef1[MainActivity]
05-12 10:18:12.001 12708 12708 D TAG     : onStop: alertDialog.isShowing():false
05-12 10:18:12.005 12708 12708 D TAG     : onDestroy: alertDialog.isShowing():false
05-12 10:18:12.015 12708 12757 D Surface : Surface::disconnect(this=0x7170e45000,api=1)
05-12 10:18:12.018 12708 12708 D View    : [Warning] assignParent to null: this = DecorView@ca42725[MainActivity]
05-12 10:18:12.167 12708 12708 D TAG     : onCreate:
05-12 10:18:12.182 12708 12708 D knealq  : onResume: i:1
05-12 10:18:12.183 12708 12708 D TAG     : onAnimationUpdate: 0
05-12 10:18:12.184 12708 12708 D TAG     : onResume: mExpandedFraction: 0.2737995
05-12 10:18:12.184 12708 12708 D TAG     : onResume: getScreenWidth: 720
05-12 10:18:12.184 12708 12708 D TAG     : onResume: getScreenHeight: 1461
05-12 10:18:12.184 12708 12708 D TAG     : onResume: checkDeviceHasNavigationBar: true
05-12 10:18:12.185 12708 12708 D TAG     : getNavigationBarHeight: 96.0
05-12 10:18:12.185 12708 12708 D TAG     : onResume: getNavigationBarHeight: 96
05-12 10:18:12.186 12708 12708 D TAG     : onResume: getStatusBarHeight: 43
05-12 10:18:12.186 12708 12708 D TAG     : onResume: duijiao: 39.833196157492175
05-12 10:18:12.186 12708 12708 D TAG     : onResume: duijiao2: 1754.5369759569046
05-12 10:18:12.191 12708 12708 V PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = null, this = DecorView@5d3fc27[]
05-12 10:18:12.196 12708 12708 D ViewRootImpl[MainActivity]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
05-12 10:18:12.202 12708 12708 V PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@21d1372, this = DecorView@5d3fc27[MainActivity]
05-12 10:18:12.205 12708 12708 D TAG     : onAnimationUpdate: 0
05-12 10:18:12.241 12708 12708 E GraphicExt: GraphicExtModuleLoader::CreateGraphicExtInstance false
05-12 10:18:12.243 12708 12757 D Surface : Surface::connect(this=0x716fb2d000,api=1)
05-12 10:18:12.245 12708 12757 D Surface : Surface::setBufferCount(this=0x716fb2d000,bufferCount=3)
05-12 10:18:12.246 12708 12757 D Surface : Surface::allocateBuffers(this=0x716fb2d000)
05-12 10:18:12.282 12708 12708 D TAG     : onDismiss: androidx.appcompat.app.AlertDialog@cc2491f
05-12 10:18:12.294 12708 12708 D TAG     : onAnimationUpdate: 6
05-12 10:18:12.330 12708 12708 I AssistStructure: Flattened final assist data: 2028 bytes, containing 1 windows, 10 views
05-12 10:18:12.333 12708 12708 D TAG     : onAnimationUpdate: 12
05-12 10:18:12.360 12708 12708 D TAG     : onAnimationUpdate: 20

alertdialog旋转屏幕消失造成leak window相关推荐

  1. iOS手动和自动旋转屏幕

    1.手动旋转屏幕函数 - (void)setOrientation: (UIInterfaceOrientation)orientation {if([[UIDevice currentDevice] ...

  2. vue标签旋转_vue.js编写移动端页面,检测旋转屏幕,横竖屏。

    初学vue,想要在检测到旋转屏幕后显示遮罩层. 现在我的想法是在mounted时期添加监听屏幕旋转事件,如果检测到了,则修改data中的值isShowCover来改变v-show中的真假值,来达到显示 ...

  3. ios 旋转屏幕试图切换_总结iOS App开发中控制屏幕旋转的几种方式

    在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewControlle ...

  4. iphone横竖屏切换,旋转屏幕

    http://www.cocoachina.com/bbs/simple/?t124992.html 1.用UINavigationController处理2个以上ViewController跳转时, ...

  5. android 旋转屏幕全屏,重新组合活动布局以在旋转屏幕时全屏播放video

    在一个活动中,我嵌入了一个video窗口小部件(与SurfaceView相关联的VideoView或MediaPlayer),当旋转屏幕时,应调整其大小. 此活动用作TabHost中的内容. 我目前的 ...

  6. ios 旋转屏幕试图切换_iOS屏幕旋转及其基本适配方法

    屏幕旋转示例.jpeg 前段时间抽空总结了一下iOS视频播放的基本用法,发现这其中还有一个我们无法绕过的问题,那就是播放界面的旋转与适配.的确,视频播放与游戏类型的App经常会遇到这个的问题.由于至今 ...

  7. Android 性能优化之旋转屏幕优化

    我的博客原文地址 问题背景 在桌面转屏发现响应不够迅速,对比其他产品有很大的提升空间,针对此问题进行了一些分析和优化. 问题分析和解决方法 首先简单介绍一下旋转屏幕的流程,首先各个界面要进行重绘,在重 ...

  8. 通过优雅的方式强制旋转屏幕

    谨慎能捕千秋蝉,小心驶得万年船                         --<庄子语录> 前言 方向旋转在日常App上基本都会用到,用的时候可能会因为赶工期而以实现功能为主,认真思 ...

  9. 解决Flutter旋转屏幕状态栏空缺的问题

    问题 最近要实现一个视频播放器,全屏播放时需要旋转屏幕,把案例拿出来试了一下,旋转屏幕后呈现的状态是这样 解决办法 打开项目下android/app/src/main/res/values/style ...

最新文章

  1. 转: 理解AngularJS中的依赖注入
  2. 修改CodeSmith中的SchemaExplorer.MySQLSchemaProvider
  3. 为何Google比苹果和微软更需要HTML5?
  4. thingsboard官网单机并发量
  5. 题库练习1(单词长度、统计字符个数、)
  6. 计算机网络相关的知识,计算机网络知识整理
  7. Spring中ApplicationContextAware的用法
  8. Web-IM前端解决方案
  9. kangle服务器搭建java_linux下kangle虚拟主机-架设java空间的教程及心得
  10. python中静态方法存在的意义
  11. Ubuntu 下解压tar.xz方法
  12. hdfs居然无法正常停止
  13. html圆圈里面有数字,HTML + CSS:编号列表与数字圆圈
  14. SpringCloud-Netflix
  15. 中国现代书画家——袁晓丹、潘文兵、郑锋等
  16. 基于并查集的六度分隔理论的验证与实现
  17. ubuntu18.04安装搜狗输入法之后无法使用的问题
  18. openwrt php 编译环境,openwrt基础编译教程
  19. 基于最小二乘法的——线性回归拟合(一)
  20. CSS3 transform 2D变幻,过渡

热门文章

  1. python吃显卡还是内存不足_解决Pytorch 训练与测试时爆显存(out of memory)的问题
  2. 记录python开发第一个app,实现word转html的桌面应用
  3. 数据库DQL单表查询
  4. 计算机编程课程顺序_您可以在八月开始的500项免费在线编程和计算机科学课程
  5. 如何发布日历提醒推送消息服务器,iOS开发 -- 通过app向手机自带的日历中添加事件提醒...
  6. java创建文件夹(Java创建文件夹失败重新创建)
  7. 【解决方案】智慧国土管理靠什么?EasyCVR综合性视频监控管理系统成支撑
  8. 微信小程序——登录/注册页面的实现
  9. 重学计算机(六、程序是怎么运行的)
  10. java swing(GUI) MySQL实现的学生选课签到考勤系统源码开发教程