Android开发艺术探索(一)Activity生命周期和启动模式

一、Activity 生命周期

1.1 典型情况下的生命周期(用户参与的情况下)

(1)onCreate:表示 Activity 正在被创建,生命周期的第一个方法,可以做一些初始化工作,调用 setContentView() 去加载布局资源、初始化 Activity 所需数据等
(2)onRestart:表示 Activity 正在重新启动。一般情况下,由 Activity 不可见变为可见时被调用
(3)onStart:表示 Activity 正在被启动,即将开始,这时 Activity 可见,但不在前台,无法和用户交互,可理解为已经显示,但看不到
(4)onResume:表示 Activity 已经可见,并且在前台开始活动
(5)onPause:表示 Activity 正在停止,可以做一些存储数据、停止动画等工作,但不能太耗时,否则会影响新 Activity 的显示,即 onPause 执行完,新 Activity 的 onResume 才会执行
(6)onStop:表示 Activity 即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时
(7)onDestroy:表示 Activity 即将被销毁,是 Activity 生命周期的最后一个回调,可以做一些回收工作和资源的释放

问题1:onStart 和 onResume,onPause 和 onStop 看起来差不多,实质上有什么不同?
解:从实际使用过程中,确实看起来差不多,但是这两个回调表示了不同的意义,onStart 和 onStop 是从 Activity 是否可见的角度来回调的,onResume 和 onPause 是从 Activity 是否位于前台的角度来回调的

问题2:当前 Activity A,打开 Activity B,那么 A 的 onPause 和 B 的 onResume 哪个先执行?
解:Activity A 的 onPause 先执行
Activity A 的 onPause 先执行

1.2 异常情况下的生命周期(Activity 被系统回收或当前设备的 Configuration 发生改变导致 Activity 被销毁重建)

Activity 在异常情况下终止,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态,这个方法在 onStop 之前执行,和 onPause 没有时序关系,可能在前或后执行
Activity 被重新创建后,系统会调用 onRestoreInstanceState,并把 onSaveInstanceState 方法保存的 Bundle 对象作为参数传递给 onCreate 和 onRestoreInstanceState 方法,
onRestoreInstanceState 在 onStart 之后调用

旋转屏幕时,指定 android:configuration=”orientation|screenSize”,Activity 不会重新创建,onConfigurationChanged 会被调用,可做一些特殊处理

二、Activity 启动模式

2.1 LaunchMode

为什么需要启动模式?多次启动同一个 Activity 时会重复创建出多个实例,这是默认行为,所以需要有启动模式来修改默认行为

(1)standard:标准模式,系统默认模式。特点是每启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,创建出来的新实例的生命周期符合典型情况下 Activity 的生命周期
(2)singleTop:栈顶复用模式,若需要启动的 Activity 此时在栈顶,则不再创建新的实例,同时它的 onNewIntent 方法会被回调,此方法可以取出请求过来的信息;若需要启动的 Activity 不在栈顶,那么会创建新的 Activity
(3)singleTask:栈内复用模式,单实例模式

a. 启动当前模式的 Activity 后,系统会寻找是否存在此模式的任务栈,若不存在则先创建该任务栈,然后创建 Activity 实例并将其入栈
b. 栈内若存在当前模式的 Activity 实例,会让栈内所有在此 Activity 上面的 Activity 全部出栈,同时调用其 onNewIntent 方法

(4)singleInstance:单实例模式,加强的 singleTask,除了 singleTask 的所有特性外,此种模式的 Activity 只能单独的存在于一个新的任务栈中,由于栈内复用,后续不会创建新的 Activity,除非该任务栈被系统销毁了

2.1.1 如何指定启动模式

a. 通过 AndroidManifest.xml,给 Activity 指定启动模式
b. 通过 Intent 中设置标志位来为 Activity 指定启动模式
区别:
1. 优先级:b > a
2. 限定范围:a 无法为 Activity 指定 FLAG_ACTIVITY_CLEAR_TOP 标识,b 无法为 Activity 指定 singleInstance 模式

2.2 Flags

1.指定 Activity 的启动模式
FLAG_ACTIVITY_NEW_TASK:为 Activity 指定 singleTask 启动模式
FLAG_ACTIVITY_SINGLE_TOP:为 Activity 指定 singleTop 启动模式

扫描二维码关注公众号,回复: 2577888 查看本文章

2.影响 Activity 的运行状态
FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的 Activity 启动时,在同一个任务栈内位于此 Activity 上的 Activity 都要出栈,该标记位一般会和 singleTask 一起出现
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有此标记位的 Activity 不会出现在历史 Activity 的列表中,若不希望用户通过历史列表找到此 Activity 时,可以使用该标记位

三、InterFilter 的匹配规则

  1. 启动 Activity
    a. 显式调用:需要明确指定被启动对象的组建信息(包名 + 类名)
    b. 隐式调用:需要明确指定组件信息

  2. 隐式调用:需要 Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息(action、category、data),如果不匹配,则无法启动目标 Activity
    a. 一个过滤列表可以有多个 action、category、data,只有 Intent 同时匹配 action 类别、category 类别、data 类别才算完全匹配,只有完全匹配才能成功启动目标 Activity
    b. 一个 Activity 可以有多组 intent-filter,Intent 只要能够匹配任意一组即可成功启动目标 Activity

  3. action 匹配规则
    action 是一个字符串,系统预定义了一些 action,也可以自定义 action
    匹配规则:Intent 中必须有一个 action 和过滤规则中的其中一个 action 字符串内容完全一毛一样才能匹配成功,区分大小写

  4. category 匹配规则
    category 是一个字符串,系统预定义了一些 category,也可以自定义 category
    匹配规则:Intent 中如果有 category,那么已有的 category 都必须和过滤规则中的其中一个 category 相同
    可以没有 category,因为系统会默认为 Intent 添加 “android.intent.category.DEFAULT” 这个 category
    所以为了 Activity 能够接收隐式调用,Activity 对应的 intent-filter 就必须指定默认的 category,即 “android.intent.category.DEFAULT”

  5. data 匹配规则
    匹配规则和 action 类似,Intent 中必须有一个 data 和过滤规则中的其中一个 data 匹配

特殊的 action、category

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />

两者共同作用是用来标明这是一个入口 Activity,应用才能出现在桌面应用列表中,少了任何一个都没有实际意义,也无法出现在桌面应用列表中

猜你喜欢

转载自blog.csdn.net/qq_21586317/article/details/79821098