Android - Activity 生命周期

本文深入探讨Android中Activity的生命周期,包括七个关键阶段:onCreate、onStart、onResume、onPause、onStop、onDestroy及onRestart。通过具体场景演示各阶段如何被触发,并讨论了与屏幕旋转和数据持久化相关的特殊行为。

本文主要參考这篇文章和任玉刚的《Android开发艺术探索》一书,谢谢两位作者!

经典的activity生命周期图 (图片来源于网络):
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
7个方法简单描写叙述例如以下:
1、 onCreate Activity 被创建时调用 
2、onStart:Activity正在被启动,已经可见,但还未出如今前台。还不能和用户进行交互
3、 onResume: Activity已经可见。并出如今前台,能够和用户进行交互了
4、 onPause: Activity正在停止。能够做一些存储数据、停止动画等操作,但不能太耗时。由于 onPause必须先运行完,新的 Activity的 onResume才会运行
5、 onStop:相同不能做 太耗时的操作
6、 onDestory: Activity被销毁时调用
7、 onRestart: Activity正在被又一次启动,普通情况下。当 Activity从不可见又一次变为可见时, onRestart方法就会被调用
下边是7个方法被调用的详细场景:
A、第一次进入:
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
B、按home键、锁屏键和跳转时:
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
C、当中比較特殊的是,在跳转到新的activity时,假设新的activity採用了透明主题等。那么。当前activity不会回调onStop方法:
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
对上面的log显示情况做一下简单总结:
一、onStart和 onResume 方法 onPause和 onStop方法从描写叙述上看是几乎相同的,在普通情况下,没有明显的差别, 他们总是成对的出现,而且 onStop方法总是接着 onPause得到运行,但在有些情况下,仅仅会运行 onPause而不会运行 onStop。比方上边的C,而这就能够看出 onPause和 onStop的某些差别( onStart和 onResume同理
二、 onSaveInstanceState方法的调用时机是在onStop之前。但它和 onPause究竟谁先被调用,还未找到根据。

在本文开头提到的文章中,作者的測试显示

onSaveInstanceState先运行。而本文中測试结果则显示 onSaveInstanceState后运行。
三、在以上的測试中。仅仅有onSaveInstanceState方法被调用了,而 onRestoreInstanceState 方法却并没有被调用。採用 《android开发艺术探索》一书中的话来说。系统仅仅会在 Activity即将被销毁而且有机会又一次显示的情况下才会去调用 onRestoreInstanceState方法。如:
D、横竖屏切换时:
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
Activity异常终止的情况下,系统会调用 onSaveInstanceState方法来保存当前 Activity 的状态,当 Activity被又一次创建之后,系统会调用 onRestoreInstanceState,而且把 Activity销毁时 onSaveInstanceState方法所保存的Bundle对象作为參数同一时候传递给 onRestoreInstanceState和 onCreate方法, 在恢复数据时,选择 onRestoreInstanceState和 onCreate方法都能够,但 二者 是有差别的: onRestoreInstanceState方法一旦被调用,其參数 (Bundle savedInstanceState)一定有值。可是,在正常启动的情况下, onCreate方法的 (Bundle savedInstanceState)參数值为null,所以假设採用 onCreate方法进行数据恢复。就 必需要先进行推断, 假设 savedInstanceState不为null,则说明 Activity 被重建了。我们就能够取出之前保存的数据进行恢复。

另外, 从时间上来看。 onRestoreInstanceState方法的调用在onStart之后。 官方文档建议採用 onRestoreInstanceState方法来恢复数据。

E、假设不想让Activity在屏幕旋转的时候又一次创建,就能够给configChanges属性加入orientation这个值:
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
screenSize这个选项比較特殊,它和编译选项有关。当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重新启动。否则会导致Activity重新启动。另外,尽管进行了相关的配置之后,Activity不重新启动了。可是,系统却调用了onConfigurationChanged方法,这时候就能够依照需求进行对应的处理了。
F、指定横竖屏:
能够在清单文件里设置android:screenOrientation="portrait",或是在Java文件里使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 指定为竖屏,
在清单文件里设置android:screenOrientation=" landscape "。或是在Java文件里使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 指定为横屏。
在这两种情况下,屏幕方向发生改变时,没有不论什么方法被调用。

G、退出Activity:
Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..

转载于:https://www.cnblogs.com/wzzkaifa/p/7337363.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值