现代码构造
以下为写的测试界面。
写了两个Activity
,一个叫MainActivity
;另一个叫LearnTestActivity
。
通过MainActivity
启动LearnTestActivity
,且在LearnTestActivity
的onCreate
方法中设置为横屏模式。
LearnTestActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//设置为横屏模式
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
}
两个界面均进行生命周期打印。
MainActivity
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
"AllLifecycle-MainActivity${event.name}".toLogI()
}
})
LearnTestActivity
lifecycle.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
中有<item name="android:windowIsTranslucent">true</item>
。
其实如果理解下来就是,如果设置了窗口透明,则对于上个Activity
来说就是虽然失去了焦点但是还是可见的,对应onPause
状态。对于可见怎么理解呢?比如我设置LearnTestActivity
高度为百分之六十,且偏向底部。
//在onCreate中调用,将Activity的高度设置为手机的百分之六十
val window = window
val lp: WindowManager.LayoutParams = window.attributes
lp.height = (obtainPhoneCurrentHeight(this) * 0.6).toInt()
lp.gravity = Gravity.BOTTOM
window.attributes = lp
如下图所示,我们打开了LearnTestActivity
但是依旧可以看到MainActivity
。
如果不设置<item name="android:windowIsTranslucent">true</item>
,则LearnTestActivity
则是黑色的,看不到MainActivity
。这里就不贴图了。
所以,因为依旧可见,所以MainActivity
就会跟随设置横屏。
总结
以横屏启动Activity
,上一个Activity
的生命周期竟然重走的根本原因,通过上面的分析相信大家已经很清楚了吧。
既然知道了原因,解决起来也很简单,只需要去除<item name="android:windowIsTranslucent">true</item>
或者设置android:windowIsTranslucent
为false
即可。因为我们压根没有窗口透明的需求…
创作不易,如有帮助一键三连咯🙆♀️。欢迎技术探讨噢!