在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. 这是一份不完整的数据竞赛年鉴!
  2. 蜗杆单轨滑轨的驱动的统一接口
  3. 絮语----工作四年的碎碎念
  4. 多模态理论张德禄_结构动力学中的模态分析(3) —— 模态参数及实验模态分析...
  5. xutils找id空指针_xUtils更新到3.0后的基本使用规则
  6. 《花开在眼前》听得泪流满面
  7. 在线高精度在线计时器(秒表)
  8. 设置窗体的可见性无效
  9. ipa 上传卡在鉴权_Application Loader上传app,一直卡在“正在通过 App Store 进行鉴定”...
  10. 服务器登记信息查询,勤哲Excel服务器数据查询
  11. 警惕!ADSL远程盗号竟如此简单(转)
  12. 比特率与波特率的区别
  13. 【Unity】Button基础-按钮更换图片样式
  14. Unity3D Delegate
  15. 计算机专业该如何找实习工作?迷茫、不知所措的你值得一看~
  16. 传奇世界开服教程:传奇世界开服需要准备什么?前期需要投入多少?
  17. Excel 2010 VBA 入门 033 批量合并相同的单元格
  18. VUE项目的e2e自动化测试超详细安装过程(保姆级)
  19. 华科计算机保研复试题目,2010华科保研复试经验谈
  20. 好丽友玩转线下营销,移动派屋亮相五一小长假

热门文章

  1. 研究生导师的“难言之隐”
  2. 企业文化在企业管理中的作用
  3. js刷新页面得重新加载和页面的刷新
  4. NO.2 微信第三方平台(小程序)授权流程技术说明
  5. ICP许可证过期了还能补办吗
  6. 怎么用计算机解开手机,怎么用手机解锁电脑?用手机指纹解锁电脑图文教程
  7. 魅族手机CUP浮点运算测试BUG
  8. 金山云郝明非:一年上线整套流媒体处理服务
  9. arm裸机程序启动流程
  10. Buffon's Needle