关闭

关于Activity的一点愚见

标签: Activity
242人阅读 评论(0) 收藏 举报
分类:

这一段时,准备研究一下四大组件中Activity的启动过程。在此之前,让我自己总结一下Activity里面一些基础的知识点。

Activity 的生命周期

Activitty有七大生命周期,也是有七个函数标识着这个七个生命周期。下面就用最常见的图来显示整个路程:
Activity生命周期

从上图可以清晰的知道:
Activity的七大生命周期分别为:

1.onCreate():这个方法是指Activity被创建,在这个方法中将会做一些初始化工作,如setContentView去加载一些资源文件,需要打开Service的时候,也可以在这里startService()等等。

2.onStart():表示这个Activity正在被启动,即将开始。这个时候Activity已经是可见,但是没有出现在前台,不能与用户交互。

3.onResume():表示Activity已经可见了,并且在前台运行,可以和用户交互了。这里要注意onStart()的时候Activity还在后台运行这个时候可见不可交互,onResume()的时候,Activity在前台运行了。

4.onPause():表示Activity正在停止。接下来分两种情况,要么立即调用onStop()方法,要么立即调用onResume去恢复在Activity栈中前一个Activity。这个时候,可以释放掉一些消耗CPU资源,停止动画,以及保存数据。记住一定要时间短,快。不然会影响新的新的Activity的显示。

5.onStop():表示Activity即将停止。此时Activity不可见。和onPause的区别在于,如果启动的新活动活动是对话框,那么onPause调用,onStop不调用。可以做些稍微重量级一点的回收工作。

6.onRestart():表示从Activity不可见到可见的时候,被调用。一般来说,这个行为是用户造成的,比如说用户按Home键去到桌面,或者切换到新的Activity。

7.onDestroy():表示Activity即将被销毁,这是Activity最后一个生命周期,用来做回收工作和最终资源的释放。

调用情况说明:
(1)第一次启动Activity的时候,过程:onCreate->onStart->onResume;
(2)打开一个新的Activity或者切换到桌面:onPause->onStop,如果Activity是透明主题则不会调用onStop;
(3)回到原来Activity:onRestart->onStart->onResume;
(4)按Back键回退:onPause->onStop->onDestroy;
(5)Activity被系统回收后再次打开和回调过程(1)一样。

异常情况下的生命周期的分析

第一种情况:资源相关的系统配置发生改变导致Activity杀死并重新创建
比如,转屏的时候,会出现Activity被销毁并且被重建的情况。
Activity意外重建
上图清晰的表明了Activity出现意外情况导致Activity销毁重建,会调用onSaveInstanceSate函数将数据存储(也是会返回一个Parcelable类型,便于进程间通讯),将数据传递给重建好的新Activity。
onSaveInstanceState的调用时逐级保存调用,首先通知window,再通知顶级的view一般为DectorView,接着通知ziview去保存数据。

第二种情况:资源内存不足时导致低优先级的Activity被杀死
Activity优先级从高到低排列:
(1)前台Activity:正在和用户交互的Activity
(2)可见但非前台Activity:比如说弹出一个对话框,导致Activty可见但是属于后台
(3)后台Activity:已经被暂停的Activity,比如执行了onStop()

当资源内存不足时,就会按照优先级从低到高的杀死Activity所在的进程,并且通过onSaveInstanceState和RestoreInstanceState存储与恢复数据。
当一个进程不在四大组件中运行时,这个进程很快被杀死。比较好的方法是将后台工作丢到Service中完成,这样就不会轻易被系统杀死。

当我们我不想转屏是重新建立Activity,我们必须配置android:configChanges=”orientation”
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

但是到了API13之后这个方案就不会成功,我们需要这么改:
android:configChanges=”orientation|screenSize“
这样子就能阻止Activity在转屏时候的重建。

Activity的启动模式(LaunchMode)

Activity的启动模式有四种:standard,singleTop,singleTask,singleInstance

1.standard:就是标准模式,我们默认的就是这个模式。每启动一个新的Activity都会将前一个处于栈顶的Activity压入栈中,让新的Activity置于栈顶。
注意:当我们尝试着用ApplicationContext去启动standard模式的时候,会出现错误,原因是没有创建Activity的栈。

2.singleTop,栈顶复用。在这种模式下,只要栈顶存在了将要创建的Activity,则直接复用原来的Actvity,否则就创建一个新的Activity。
举个例子:任务栈内有四个活动,从栈底到栈顶依次为:ABCD。加入要创建一个新的活动D,就会复用栈顶的D,此时Activiy栈:ABCD。如果D的模式为standard,则栈内为ABCDD。

3.singleTask,栈内复用。这是一种单实例模式。在这种模式下,只要栈中存在要创建Activity都不回重新创建,而是直接使用。
举个例子:
1)任务栈S1为ABC,这时候singleTask的D请求启动,需要任务栈为S2。此时S2和D都不存在,则创建S2和D,将D压入S2中。
2)当D所需的任务栈为S1,此时任务栈存在,则创建,压入栈顶。
3)当原本存在了了ADBC,此时要创建D,则头顶上的活动将出栈,此时任务栈为AD。

4.singleInstance 单实例模式。是singleTask的加强版。具有这种属性的活动启动时会先创建一个新的栈再压入栈顶。

Activity其他零散的知识点

Activity的Flags:
通过方法addFlags添加
1.FLAG_ACTIVITY_NEW_TASK :意思是将活动指定为singleTask
2.FLAG_ACTIVITY_SINGLETOP:活动指定为singleTop
3.FLAG_ACTIVITY_CLEAR_TOP:一般适合singleTask一起使用,作用是具有这种属性的活动将会把位于他之上的活动全部出栈,并位于栈顶。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS :具有标记的Activity不会出现在历史Activity的列表中,当我们不希望用户通过历史列表回到我们的Activity中这个标记比较有用。

Activity的interfilter匹配规则:
需要同时匹配其中的action,category,data,才会匹配成功。

Activity的action的匹配规则:
要求Intent中的action存在且必须和过滤规则中的一个action相同。

Activity的category的匹配规则:
要求所有的category都必须和过滤规则中的一个category相同。

Activity的data匹配规则:
要求Intent中必须含有data且data能够和过滤规则中的一个data相同。

感谢郭霖大神的第一行代码和任玉刚大神的android开发探索艺术。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14189次
    • 积分:128
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论