01 Activity的生命周期和启动模式

2019/02/26 posted in  Android开发艺术探索
  1. 典型情况:在有用户参与的情况下,Activity所经过的生命周期的改变
  2. 异常情况:Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。

1.1 Activity的生命周期全面分析 / 1

1.1.1 典型情况下的生命周期分析 / 2

  • onStart和onResume,onPause和onStop的区别?
    • onStart和onStop是从Activity是否可见来回调的
    • onResume和onPause是从Activity是否位于前台这个角度来回调的。
  • 当前Activity为A,打开ActivityB,A的onPause会先于B的onResume执行。所以不能在onPause中执行重量级的操作,因为onPause方法执行完新的Activity的onResume才可以执行。

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

情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建

  1. Activity异常状态终止时,系统会调用onSaveInstanceState来保存Activity的状态
  2. 当Activity被重新创建时,系统会调用onRestoreInstanceState,同时把被销毁时保存的Bundle对象传递给方法。
  3. 系统默认恢复的:文本框的输入、ListView的滚动位置
  4. 保存和恢复View的层次结构:委托上层保存数据 Activity > Window > ViewGroup(DecorView) 委托思想 上层委托下层,父容器委托子元素处理事情。

情况2:内存资源不足导致低优先级的Activity被杀死

  1. Activity按优先级从高到低:
    1. 前台Activity:正在和用户交互的Activity
    2. 可见但非前台Activity:有弹窗的Activity
    3. 后台Activity:已经被暂停的Activity
  2. 系统配置发生改变时不重建Activity的方法:
    1. android:configChange="orientation"

1.2 Activity的启动模式 / 16

1.2.1 Activity的LaunchMode / 16

四种启动模式

  1. standard:标准模式
  2. singtop:栈顶复用模式,位于栈顶时不会重复创建
  3. singleTask:栈内复用模式,实例以上Activity全部出栈,把实例调到栈顶。
  4. singleInstance:单实例模式,创建实例时会创建新的任务栈

TaskAffinity 任务相关性

  1. taskAffinity:标识一个Activity所需要的任务栈的名字
  2. 默认Activity的栈名为包名
  3. 主要和singTask或allowTaskReparenting属性配对使用
    1. taskAffinity+singleTask,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中
    2. taskAffinity+allowTaskReparenting,应用A启动应用B的某个Activity后,此Activity的allowTaskReparenting为true时,此Activity会直接从应用A的任务栈转移到B的任务栈中。

1.2.2 Activity的Flags / 27

Flags影响启动模式、运行状态等

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_SINGLE_TOP
  3. FLAG_ACTIVITY_CLEAR_TOP
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

1.3 IntentFilter的匹配规则 / 28

Activity的隐式调用需要Intent能够匹配目标组件的IntentFilter中的过滤信息,如果不匹配将无法启动目标Activity。

匹配规则:

  1. 一个intent-filter中可以有多个cation、category、data
  2. 一个Intent同时匹配action、category、data 才算完全匹配,只有完全匹配才能成功启动目标Activity。
  3. 一个Activity 中可以有多个intent-filter,只要能匹配任何一组intent-filter即可成功启动对应的Activity。

  • action的匹配规则
    • 要求Intent中的action存在,且必须和过滤规则中的其中一个action相同。
  • category的匹配规则
    • 要求Intent 中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。
  • data的匹配规则
    • 如果过滤规则中定义了data, 那么Intent 中必须也要定义可匹配的data。
    • data由两部分组成,mineType和URI。
      • mimeType指媒体类型,比如image/jpeg、audio/mpeg4-generic和video/*等,可以表示图片、文本、视频等不同的媒体格式。
      • URI包含的数据就比较多了,URI结构:scheme://host:port/path|pathPrefix|pathPattern
      • Scheme、Host、Port、Path等
  • 隐式启动一个Activity时,可能出现错误,判断是否有Activity符合匹配规则:
    • PackageManager.resolveActivity或Intent.resolveActivity,返回最佳匹配的Activity信息
    • queryIntentActivities,返回所有成功的Activity信息