《Android开发艺术探索》笔记——Activity的生命周期和启动模式

    • Activity生命周期
      • 正常情况
      • 异常情况
    • 启动模式
      • Activity的LaunchMode
      • Activity的Flags
    • IntentFilter匹配规则


Activity生命周期

Activity的生命周期,在正常情况下和异常情况下略有不同。正常情况下,是指Activity在用户参与情况下,生命周期的变化,也就是说,其生命周期可以受用户控制;异常情况,是指Activity被系统回收,或者由于当前设备Configuration发生改变而导致Activity销毁重建,也就是说,其生命周期不受用户控制。

正常情况

Activity的生命周期为:onCreate、onRestart、onStart、onResume、onPause、onStop、onDestroy
onCreate:Activity第一次被创建的时候调用,在其生命周期中,只被调用一次,一般在其中做一些初始化操作;
onRestart:Activity被重新启动,当Activity从不可见重新变为可见时调用;
onStart:Activity正在被启动,这时Activity已经可见,但是还不在前台,我们还看不到;
onResume: Activity可见,并且已经在前台活动,可以和用户交互了;
onPause:Activity正在停止,执行完后新的Activity的onResume才可以执行,可做存储数据,回收动画等不耗时的操作;
onStop: Activity即将停止,可做不太耗时的,稍微重量级的回收工作;
onDestroy: Activity即将被销毁,做回收工作和资源释放,只调用一次。

备注:onPause和onStop中都不能做耗时操作,尤其是onPause,因为它会影响新的Activity的开启,所以我们要尽量在onStop中做一些操作。

异常情况

情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
Activity出现异常时,会在onStop之前,调用onSaveInstanceState,用以保存当前Activity状态;当Activity被重新创建后,会在onStart方法之后调用onRestoreInstanceState方法,之前onSaveInstanceState存储的Bundle对象会同时传给onCreate和onRestoreInstanceState方法。(另外,每个View也都有相应的onSaveInstanceState和onRestoreInstanceState方法,可以恢复其视图结构,listview滚动位置等数据。)
如果想在系统配置发生改变的时候,Activity不重新创建,需要设置configChanges属性,常用的有orientation、locale、keyboardHidden
例子:android: configChanges=” orientation|locale|keyboardHidden”

情况2:资源内存不足导致低优先级的Activity被杀死
Activity优先级:前台Activity > 可见但非前台Activity > 后台Activity

启动模式

Activity的LaunchMode

Activity的启动模式共有4种:
(1) standard:标准模式(系统默认)
每次启动一个Activity都会重新创建一个新的实例,无论这个实例是否存在。
谁启动了这个Activity,这个Activity就会运行在启动它的那个Activity所在的任务栈中。
(2) singleTop:栈顶复用模式
如果新的Activity已经位于栈顶,那么此Activity不会被重建,同时其onNewIntent方法会被调用。
(3) singleTask:栈内复用模式
只要Activity在一个栈中存在,那么多次启动这个Activity都不会重新创建实例,系统会回调其onNewIntent。另外,singleTask有默认clearTop的作用。
(4) singleInstance:单实例模式
加强版的singleTask,具有此模式的Activity只能单独地位于一个任务栈中。

备注1:Activity的任务栈,需要说一下TaskAffinity参数。默认情况下,所有Activity任务栈名字为应用包名。TaskAffinity属性主要和singleTask启动模式和allowTaskReparenting属性使用。
TaskAffinity+singleTask:TaskAffinity参数能够指定具有singleTask启动模式的Activity所处的任务栈;
TaskAffinity+allowTaskReparenting:allowTaskReparenting参数能够将一个Activity的任务栈修改为其TaskAffinity所指定的任务栈。

备注2:指定Activity启动模式的两种方法:
(1) 在AndroidMenifest中设置launchMode
(2) 通过Intent设置标志位——Intent.addFlags(XXX);
第二种方法的优先级高一些,以第二种方法为准。

Activity的Flags

标记位能够设定Activity的启动模式,还可以影响Activity的运行状态。下面是几个常用的标记位:
FLAG_ACTIVITY_NEW_TASK:对应singleTask
FLAG_ACTIVITY_SINGLE_TOP:对应singleTop
FLAG_ACTIVITY_CLEAR_TOP:同一个栈中位于其上的Activity都要出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不会出现在历史activity的列表中,等同于android:excludeFromRecents=”true”

IntentFilter匹配规则

隐式调用,需要intent能够匹配目标组件中intentFilter设置的过滤信息
过滤信息有:action、category、data
一个Activity中可以有多个intent-filter,只要匹配任意一组intent-filter即可成功启动对应Activity。
action匹配规则:Intent中的action必须匹配过滤规则中任意一个action,区分大小写。
category匹配规则:Intent中可以没有category,但如果有,每一个category必须和过滤规则中的category匹配。(DEFAULT情况要在intent-filter中添加)。
data匹配规则:与action类似。data由两部分组成,mimetype和uri。

瞎聊:写读书笔记的原因是,看书的过程是对自己已有知识体系的梳理,记录下读书笔记,能够整理思绪,也方便今后查阅。

你可能感兴趣的:(读书笔记)