我将带头冲锋!
网上好多讲activity的生命周期的帖子,相信大家都看了好多遍,我也看了无数遍,但是好记性不如烂笔头、实践出真知、动了手才是自己的。。。相关的谚语太多了,哈哈,其实就是总结实践一下,怕自己忘。
关于activity基本上面试的第一个问题除了自我介绍就是说一下生命周期了,我相信每个搞安卓的都知道,onCreate、onStart。。。所以这部分的知识还是很重要的,本文将从以下几个方面进行总结
目录
6. MainActivity跳转到MainActivity
8. 跳转到SecondActivity(在onPause中进行比较耗时的操作)
activity的生命周期
1. activity的生命周期
基本知识点就不概述了,相信大家都背的滚瓜烂熟了
简单说一下整体的实现:
定义了四个activity,每一个都有两个按钮进行跳转本身还有跳转下一个(Main跳Second跳Third跳Fourth)至于启动模式下面再进行说明:
正常生命周期无外乎就是activity进入,退出,跳转到新界面
测试结果:
1. 启动MainActivity
2. MainActivity返回桌面
3.重新回到MainActivity
4. 杀死后台进程重新进入MainActivity
疑问1:onDestroy没有走,这里应该是进程被杀死了,走还是要走的,但是日志就打印不了了,这个是不是应该算是异常的生命周期了,不应该算是正常生命周期的流程
5. 按返回键退出MainActivity
6. MainActivity跳转到MainActivity
7. 跳转到SecondActivity(正常主题)
疑问2:这里面如果MainActivity的onPause方法比较耗时会怎么样,
8. 跳转到SecondActivity(在onPause中进行比较耗时的操作)
这里皮一下:
for (int i = 0; i < 10000; i++) {
String text = "不是说创建对象比较耗时嘛?";
text += "不是说拼接字符串耗时嘛?";
}
还是一样的,说明跳转的时候是一定会先走onPause方法的,还是说我并不耗时,于是我作死的试了一下我认为比较大的数,场面过于血腥,我就不说结果了。
但是我没忍住还是放出了血腥的画面,我把循环次数提高到了1000W,这个数就有点恐怖了,目前我除了玩变态版的游戏接触过这么大的数,还没见过呢(啥时候我能挣这么多钱呢)
循环10000次的时候是这样的:
循环1000W次是这样的:
界面明显可以看到卡了,onPause快跑了3s,但是还是在SecondActivity的onCreate之前,没跑了,就是先走onPause,要是耗时的话后面的也都得等着,这又说明了一个问题onPause里面虽然可以进行数据的回收啊,巴拉巴拉,但是尽量别太耗时,比如循环1000w次
9. 跳转到透明主题的SecondActivity
设置透明的代码:
android:theme="@android:style/Theme.Translucent"
MainActivity的onStop确实没走
基本正常情况的Activity的生命周期的场景我也就想到这么多了,水平一般能力有限,如果有补充的欢迎留言,做第一个坐我沙发的人
异常生命周期:
1. 系统配置项的改变,横竖屏切换等等啦
这里面我把SecondActivity添加配置项,而MainActivity保持不变
不让Activity在横竖屏或者其他配置项改变的时候配置如下,以常用的横竖屏切换为例:
android:configChanges="screenSize|keyboard|orientation"
MainActivity竖屏切换到横屏:
我又添加了一个EditText,输入了一些文本,然后横竖屏旋转:
文本并没有保留。我给EditText设置了一个id之后发现文本是可以保存了,这里是一个知识点!
SecondActivity竖屏切换到横屏:
在SecondActivity中也有一个EditText,但是可以看到,并没有走onSaveInstanceState 和onRestoreInstanceState,配置了ConfigChanges就不会重新创建新的实例并且也不会保存数据了,很好理解,因为相当于之前的实例没有销毁,还是可以用之前的。
2. 系统内存不足把Activity回收了
这个暂时没有模拟出来。尴尬,我再想我再Activity里面想办法内存泄露是不是可以呢?