《Android开发艺术探索》是一本很合适初高级工程师来学习和进阶,这种书多读读对自己也有成长。作者也是从自己的开发经验角度出发,似一位导师一样给我们讲解,我认为这本书对我真的有提高,从基础的Activity的生命周期到组件定制,再到四大组件的工作原理,很实用的技术。

Activity的生命周期

1.1 Activity的生命周期

  1. onCreate Activity 创建时的初始化工作 如设置页面的ContentView、接收参数等.

  2. onRestartActivityonStop后重新启动时,会调用这个参数

  3. onStart 正在启动,即将开始,没有出现在前台,还无法和用户交互,可以理解为已经初始化完成,但是处于后台我们暂时没法看见。

  4. onResume 可见了并且处于激活态,处于前台。

    和onStart最大的不同就是onStart是在后台已经初始化完,但是无法交互。

  5. onPause 失去焦点不可以交互、处于后台。

  6. onStop 即将停止,做一些稍微重量级回收类的工作

  7. onDestory Activity即将被销毁,需要们做一些回收和资源释放类的工作。

他们之间的关系:

或者同另外一个角度来看Activity生命周期之间的关系。

异常的生命周期调用

其实我们开发中一般是按照这样的生命周期执行,但是也会有异常的一些处理,如系统内存不足时,会杀死一些进程,以回收一部分资源,来保证系统仍可以正常的运行。具体的例子可以参照:内存不足时Android 系统如何Kill进程,kill进程的顺序:

空进程— 后台进程 -> 服务进程 -> 可见进程 -> 前台进程

相对于异常Activity的生命周期过程实际上是精简版的完整生命周期,如我们按Home键,当前的进程(实际上已经成为了后台进程)可能会由于内存不足等其他原因,被系统的kill掉,此时执行时的是onPause–>onStop 还有一个是为了保存activity数据状态的onSaveInstanceState,这些属于常见的内容,可以自行搜索

Activity的启动模式(LaunchMode)

Activity的启动模式这个是我们做久项目,必须要思考和研究额内容,在很多时候,理解这些会事倍功倍。

Activity一共有四种启动方式:standard、SingleTask、SingleTop、SingleInstance。每次Activity启动都会加入加入任务栈,当销毁时又从任务栈中退出,任务栈是一个后进先出的栈结构,当任务栈中没有Activity时,系统会自动回收改任务栈。

在我们开发中,我们可能需要某一个Activity(如主界面的MainActivity)始终只有一个,没必要每次startActivity都新建一个吧。所以怎么区分这些驱动模式呢?

Standard 标准模式

若没有给Activity设置启动模式,默认的设置就是标准模式。

标准的Activity的启动方式,每次启动都会新建一个新的Activity,如Activity A(standart)对象启动Activity B(standard),就会执行标准的Activity的生命周期:

onPause –> onStop –>onCreate –> onStart ……

这样任务栈中就有了A B(从栈低到栈顶的顺序),当B在重新启动A时,就成了ABA。

图 2-1

  1. 默认的情况下,启动一个启动模式为standard的Activity启动另一个启动模式为standard的Activity,会将启动的Activity放入到前一个Activity的任务栈中,如图2-7 所示。
  2. 通过全局AppicationContext启动一个Activity,由于Application的context没有在任务栈,所以必须添加FLAG_ACITIVITY_NEW_TASK 这个标志位,来新建一个任务栈。

SingleTop 栈顶复用模式。

该模式一个重要的特性是栈顶复用,当启动一个启动模式为SingleTop的Activity,会先去找这个Activity所在的任务栈的顶部是否已经存在,若栈顶有该Activity则会复用,不会重新新建Activity,而是复用该Activity,并调用该Activity的onNewIntent方法。

图 2-2

SingleTask 栈内复用

SingleTask模式,是栈内的单例,当一个Acitiviy已经在栈内存在,多次启动这个Activity不会重新创建这个Activity实例,而是会直接调用这个栈内已经存在的该Activity实例,系统会调用这个Activity的onNewIntent,同时会清除栈内这个Activity到栈顶的所有Activity实例,实际上clearTop的效果。

如图2-2,只有3-2 可能会不一样,因为在B–>A时,Acitivity A是在任务栈中的,会将Acitivity A调至栈顶,清除A到栈顶的所有Activity,最后就只有Activity A。