Android 横竖屏切换之窗体泄露leaked window DecorView XXXActivity

前言

遇到问题

Android 横竖屏切换之窗体泄露leaked window DecorView XXXActivity

has leaked window DecorView@e6d2d3c[XXXActivity] that was originally added here

场景

在android 横竖屏切换时androidManifest 对应Activity可以设置

xml 复制代码
  <activity
       android:name=".XXXActivity"
       android:configChanges="orientation|keyboardHidden"
   />

但这样设置会让该Activity重新创建

Activity会触发生命

onPause --->onSaveInstanceState --->onStop ---> onCreate --->onStart --->onRestoreInstanceState ---->onResume

如果不做处理 可能会出现 leaked window DecorView XXXActivity

翻译就是窗体泄露 大概就是指 生命周期发生变化时 view还在显示 没有做关闭处理

即:在 Activity 上去构建一个置于 Activity 之上的 Dialog ,这个窗口会依赖于 Activity。如果在浮窗没有被 dismiss 时,Activity 被 finish,就会出现 Window Leaked!

在横竖屏切换时 首先会走 onPause 生命周期 我们可以通过监听器监听此时的窗口状态

java 复制代码
  if (loadingDialog != null) {
            if (loadingDialog.getWindow() != null)
                loadingDialog.getWindow().getDecorView().getViewTreeObserver()
                .addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() {
                    @Override
                    public void onWindowAttached() {
                        ALog.e("loadingDialog ->onWindowAttached");
                    }

                    @Override
                    public void onWindowDetached() {
                        ALog.e("loadingDialog ->onWindowDetached");
                    }
                });
        }

通过状态捕捉 来处理相应的dialog是否做了关闭处理

解决方法 一

在 Activity 中重写 onCreateDialog 方法,通过该方法让系统对当前dialog管理

java 复制代码
	@Override
	protected Dialog onCreateDialog(int id) {
	    Dialog dialog = new Dialog(this);
	    return dialog;
}

解决方法 二

在Activity的 onDestroy()直接处理 如果没有关闭就关闭掉

java 复制代码
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (progressDialog != null) {
            progressDialog.dismiss();
        }
    }
相关推荐
xiangpanf4 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx7 小时前
安卓线程相关
android
消失的旧时光-19437 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon8 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon8 小时前
VSYNC 信号完整流程2
android
dalancon8 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013849 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android10 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才10 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶11 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle