素材巴巴 > 程序开发 >

以横屏启动Activity,上一个Activity的生命周期重走了且跟随设置了横屏。WHY?

程序开发 2023-09-09 12:51:38

文章目录

现代码构造

以下为写的测试界面。

写了两个Activity,一个叫MainActivity;另一个叫LearnTestActivity

通过MainActivity启动LearnTestActivity,且在LearnTestActivityonCreate方法中设置为横屏模式。

	LearnTestActivity    override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)//设置为横屏模式requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE}
 

两个界面均进行生命周期打印。

        MainActivitylifecycle.addObserver(object : LifecycleEventObserver {override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {"AllLifecycle-MainActivity${event.name}".toLogI()}})LearnTestActivitylifecycle.addObserver(object : LifecycleEventObserver {override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {"AllLifecycle-LearnTestActivity${event.name}".toLogI()}})
 

现象

当我从MainActivity开启LearnTestActivity,理论上MainActivity生命周期会执行到onStop,不会重建。

可是真实的项目上面MainActivity生命周期却进行了重建,类似下面的效果:

AllLifecycle-MainActivityON_PAUSE
 AllLifecycle-LearnTestActivityON_CREATE
 AllLifecycle-LearnTestActivityON_START
 AllLifecycle-LearnTestActivityON_RESUME
 AllLifecycle-LearnTestActivityON_PAUSE
 AllLifecycle-LearnTestActivityON_STOP
 AllLifecycle-LearnTestActivityON_DESTROY
 AllLifecycle-LearnTestActivityON_CREATE
 AllLifecycle-LearnTestActivityON_START
 AllLifecycle-LearnTestActivityON_RESUME
 AllLifecycle-MainActivityON_STOP
 AllLifecycle-MainActivityON_DESTROY
 AllLifecycle-MainActivityON_CREATE
 AllLifecycle-MainActivityON_START
 AllLifecycle-MainActivityON_RESUME
 AllLifecycle-MainActivityON_PAUSE
 

因为LearnTestActivity的横屏是在onCreate中进行设置的,且默认启动是竖屏,所以对于LearnTestActivity来说,它的生命周期重新走一遍这是不稀奇的。

但是注意看MainActivity为什么生命周期重走了呢?而且直走到了onPause理论上应该是到onStop的呀。

原因分析

当时在项目中发现这个问题,也是花了一点时间去排查定位的,这里就不饶圈子了,原因就在于,设置了LearnTestActivit的窗口是透明。

也就是给LearnTestActivit的设置主题style中有true

其实如果理解下来就是,如果设置了窗口透明,则对于上个Activity来说就是虽然失去了焦点但是还是可见的,对应onPause状态。对于可见怎么理解呢?比如我设置LearnTestActivity高度为百分之六十,且偏向底部。

        //在onCreate中调用,将Activity的高度设置为手机的百分之六十val window = windowval lp: WindowManager.LayoutParams = window.attributeslp.height = (obtainPhoneCurrentHeight(this) * 0.6).toInt()lp.gravity = Gravity.BOTTOMwindow.attributes = lp
 

如下图所示,我们打开了LearnTestActivity但是依旧可以看到MainActivity

在这里插入图片描述

如果不设置true,则LearnTestActivity则是黑色的,看不到MainActivity。这里就不贴图了。

所以,因为依旧可见,所以MainActivity就会跟随设置横屏。

总结

以横屏启动Activity,上一个Activity的生命周期竟然重走的根本原因,通过上面的分析相信大家已经很清楚了吧。

既然知道了原因,解决起来也很简单,只需要去除true或者设置android:windowIsTranslucentfalse即可。因为我们压根没有窗口透明的需求…

创作不易,如有帮助一键三连咯🙆‍♀️。欢迎技术探讨噢!


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。