1.1 首先是Activity的生命周期
- onCreate, onStart, onRestart, onResume, onPause, onStop, onDestory 这7个回调可以说明Activity的生命周期模型。
直接上google给的生命周期图来说明:
总结以下的几点:
- Activity从创建至用户可见并能够交互,onCreate->onStart->onResume; 其中Created和Started状态属于瞬时状态,只有Resumed状态属于长时间状态。
- Activity被遮挡,无论是部分遮挡还是完全不可见,必会调用onPause, 而进入后台的activity有可能因为内存不足等原因被系统杀掉回收,所以如果有需要进行数据保留的情形,请一定在onPause或者onSaveInstance中进行。onStop只有在完全被遮挡时才会被回调。
- 当ActivityA启动ActivityB时,其时序图如下:
从图中可以看出,当ActivityA处于Resumed状态时,发送了startActivity的消息给ActivityB, 我们可以看出时序为:
ActivityA: onCreate->onStart->onResume->onPause ->onStop
ActivityB: ->onCreate->onStart->onResume
d. 启动Activity是通过intent来传递消息的,intent中不光是可以携带参数,也可以设置不同的启动方式,如:
setAction(intent, action);
setClass(context, class);
setComponent(componentName);
setClassName(package, classname);
1.2 Activity和Task Record的关系
简单的总结一下:
- 首先Task Record是用来记录Activity的调用栈情况;栈是一种通用数据结构,先进后出;
- 一般而言,一个应用程序如果不特殊指明其对应task, 那么所有的activity的task即是以应用的packagename命名的task。
- 可以通过标签android:taskAffinity来指定activity所属的task;
- Activity具有4种android:launchMode选项,分别为”standard”, “singleTop”, “singleTask”, “singleInstance”, 其中standard和singleInstance最容易理解,
Standard:当Activity在被启动时,无论什么情况都会产生一个新的实例加入到栈中记录。
singleInstance: 表明该Activity在任何时候只有一个实例,并且该实例是单独存在一个栈中记录的,也就是说此栈只存在这一个activity的实例。
singleTop: 若该Activity已经在栈顶位置时,启动该Activity时,是不会产生实例,而是会触发既有的activity的onNewIntent回调。若该Activity不在栈顶,在行为和standard一致。
singleTask: 拥有此标签的Activity,也只能产生一个实例,所以当栈中已经存在该实例的话,那么再次启动此Activity时,会将已有栈中的该Activity的实例之上的所有Activity都进行出战操作,并且触发onNewIntent回调。
5.查看task情况,可以使用以下的命令:
adb shell dumpsys activity
因个人知识和能力所限,如有错误请留言,欢迎讨论,共同进步。