Activity生命周期详解

本文详细探讨了Activity的生命周期,包括A启动B时的回调情况,透明Activity和Dialog启动的影响,onSaveInstanceState()的调用时机,以及横竖屏切换时Activity的变化。通过实例分析了不同场景下Activity的生命周期状态,并提供了源码示例。
摘要由CSDN通过智能技术生成

目录

问题一:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

问题二:谈谈onSaveInstanceState()方法?何时会调用?

问题三:横竖屏切换时,Activity的声明周期如何变化

源码展示:

1、style.xml

2、AndroidManifest.xml

3、FirstActivity

4、SecondActivity

5、ThirdActivity

6、FourActivity

7、FiveActivity


以实际案例来详细了解Activity的声明周期。

问题一:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

  • A启动B:A的onPause() -->B的onCreate()-->onStart()-->onResume()-->A的onStop()
  • A启动B,B完全透明:A的onPause() -->B的onCreate()-->onStart()-->onResume()
  • A界面启动一个dialog:如果是单纯的一个dialog,并不调用生命周期,如果启动的是一个以dialog形式展示的activity,同上。

Demo逻辑介绍:

FirstActivity:主Activity

1、启动SecondActivity:普通的Activity

A启动B:A的onPause() -->B的onCreate()-->onStart()-->onResume()-->A的onStop()

问题:A的生命周期为什么会先调用onPause(),在B完全展示后再去调用A的onStop()方法,为什么要这样设计?

答:onPause的调用是“Another activity comes in front of the activity”,即另一个activity跑到前台来的时候,前一个activity的onPause方法会被调用。

onStop的调用是“The activity is no longer visible”,也就是完全不可见的时候调用的,这个完全不可见真的就是指视觉上的完全看不到而已,无论是按home键返回桌面,还是启动另一activity把原activity完全遮住,都会调用onStop。但是当启动的activity是透明的时候,原activity只会进入onPause状态,而不会走到onStop状态,因为原acitivity还是可见的,虽然逻辑上被遮住了,但是视觉上确实是可见的,这一点要注意。
 

2、启动ThirdActivity:完全透明的Activity

A启动B,B完全透明:A的onPause() -->B的onCreate()-->onStart()-->onResume()

3、启动FourActivity:以Dialog形式展示的Activity

A启动B,B以Dialog形式展示:A的onPause() -->B的onCreate()-->onStart()-->onResume()

4、启动一个Dialog

A界面启动一个dialog:如果是单纯的一个dialog,并不调用生命周期

问题二:谈谈onSaveInstanceState()方法?何时会调用?

  • a.出现时机:异常 情况下Activity 重建,非用户主动去销毁
  • b.系统异常终止时,调用onSavaInstanceState来保存状态。该方法调用在onStop之前,但和onPause没有时序关系。
  • c.Activity被重新创建时,调用onRestoreInstanceState(该方法在onStart之后),并将onSavaInstanceState保存的Bundle对象作为参数传到onRestoreInstanceState与onCreate方法。

5、启动FiveActivity

在该界面设置一个按钮(点击触发空指针异常),点击按钮界面崩溃退出。

结果:在此种情况下不会触发onSaveInstanceState()方法!

另外:横竖屏切换也不会触发onSaveInstanceState()方法! 但是会触发onRestoreInstanceState()方法。

activity 中的 onSaveInstanceState方法的调用时机 在该文章中所列举的几种方法都尝试过了,但是都没有触发onSaveInstanceState()方法。

 

问题三:横竖屏切换时,Activity的声明周期如何变化

如果不做任何配置:

会销毁当前Activity然后在新创建一个,生命周期如下:

onPause() --> onStop() --> onDestory() --> onCreate()-->onStart()-->onResume()

Adnroid 3.2以后的SDK需要设置: android:configChanges="orientation|keyboardHidden|screenSize"

manifest中为相应的Activity设置android:configChanges属性即可
Andorid 3.2以前的SDK可以使用如下配置
android:configChanges="orientation|keyboardHidden"
而Adnroid 3.2以后的SDK必须添加一个screenSize属性,具体如下
android:configChanges="keyboardHidden|orientation|screenSize"
或者
android:configChanges="orientation|screenSize"

对android:configChanges的总结
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次(在三星4.0设备上切横屏和竖屏都是执行一次,而并非这里说的有执行两次的情况);
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
注:上述描述是在Android3.2以前,如果缺少了keyboardHidden选项,不能防止Activity的销毁重启,也就不能执行onConfigurationChanged方法了。在3.2之后,必须加上screenSize属性才可以屏蔽调用Activity的生命周期(一些设备上可以不需要keyboardHidden,只要screenSize就可以了,保守起见还是继续保留keyboardHidden吧)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值