以横屏启动Activity,上一个Activity的生命周期重走了且跟随设置了横屏。WHY?
文章目录
现代码构造
以下为写的测试界面。
写了两个Activity
,一个叫MainActivity
;另一个叫LearnTestActivity
。
通过MainActivity
启动LearnTestActivity
,且在LearnTestActivity
的onCreate
方法中设置为横屏模式。
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
中有
。
其实如果理解下来就是,如果设置了窗口透明,则对于上个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
。
如果不设置
,则LearnTestActivity
则是黑色的,看不到MainActivity
。这里就不贴图了。
所以,因为依旧可见,所以MainActivity
就会跟随设置横屏。
总结
以横屏启动Activity
,上一个Activity
的生命周期竟然重走的根本原因,通过上面的分析相信大家已经很清楚了吧。
既然知道了原因,解决起来也很简单,只需要去除
或者设置android:windowIsTranslucent
为false
即可。因为我们压根没有窗口透明的需求…
创作不易,如有帮助一键三连咯🙆♀️。欢迎技术探讨噢!
标签:
相关文章
-
无相关信息