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

26 篇文章 2 订阅
7 篇文章 1 订阅

现代码构造

以下为写的测试界面。

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

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

	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:windowIsTranslucentfalse即可。因为我们压根没有窗口透明的需求…

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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumpkin的玄学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值