Activity的生命周期和启动模式
Activity的生命周期和启动模式
- Activity的生命周期
- Activity的启动模式
- IntentFilter的匹配规则
Activity的生命周期
1. 典型情况下的生命周期分析
onCreate:Activity正在被创建,可进行一些初始化工作
onStart:Activity已经可见,但还没有出现在前台
onResume:可见可操作,显示在前台
onPause:Activity正在停止,可做一些存储数据、停止动画等工作(不能太耗时,会影响到新Activity的显示)
onStop:Activity即将停止,可做回收工作(不能太耗时)
onRestart:Activity正在重新启动(onPause和onStop被执行后,重新回到该Activity时调用)
onDestroy:Activity即将被销毁,可做回收工作和资源释放
注意:
- 在新Activity启动之前,上一个Activity需要先onPause后,新的才能启动
2.onPause和onStop中都不能做耗时操作,尤其是onPause
2. 异常情况下的生命周期分析
1.资源相关的系统配置发生改变导致Activity被杀死重建
例:横竖屏切换、屏幕大小改变、软键盘显示变化
系统会调用onSaveInstanceState()来保存当前Activity的状态,当Activity重新创建后,系统会调用onRestoreInstanceState()来恢复之前的数据
注意:
onRestoreInstanceState和onCreate都会获取保存的数据,区别在于:onRestoreInstanceState一旦被调用,其参数Bundle一定有值,不用判断是否为空;但onCreate不一定,所以建议采用onRestoreInstanceState来恢复数据。
不想要Activity重建时:
可以给Activity设置configChanges属性
例:android:configChanges="orientation|screenSize|keyboardHidden"
此时当系统配置发生改变时,不会重建Activity,而是系统调用了Activity的onConfigurationChanged方法。
2.资源内存不足导致低优先级的Activity被杀死
Activity的优先级:
- 前台Activity
- 可见但非前台Activity
- 后台Activity
当系统内存不足时,系统会按照优先级由低到高杀死目标Activity所在的进程
Activity的启动模式
1. Activity的LaunchMode
(1)standard:标准模式。
每启动一个Activity都会在启动它的Activity所在的栈中重新创建一个新的实例。
(2)singleTop:栈顶复用模式。
如果新Activity已经位于任务栈的栈顶,则不会新建实例,同时调用onNewIntent方法。
(3)singleTask:栈内复用模式。
首先会寻找是否存在新Activity想要的栈,如果不存在,重新创建新的任务栈并创建Activity的实例;如果存在,判断栈中是否有Activity的实例,如果有,则把Activity调到栈顶,并调用它的onNewIntent方法,不会新建实例,如果没有,就创建实例并压入栈中。
(4)singleInstance:单实例模式。
只能单独位于一个任务栈中。
注意:
默认情况下,所有Activity所需的任务栈名字为应用的包名。
给Activity指定启动模式:
例:
android:launchMode="singleTask"
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2. Activity的Flags
FLAG_ACTIVITY_NEW_TASK
为Activity指定“singleTask”启动模式
FLAG_ACTIVITY_SINGLE_TOP
为Activity指定“singleTop”启动模式
FLAG_ACTIVITY_CLEAR_TOP
启动时,所有位于它上面的Activity都要出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
不会出现在历史Activity的列表中
IntentFilter的匹配规则
- 一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity
- Intent-filter中的过滤信息包括:action、category、data
action
只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功
category
Intent中可以没有category,但如果有,则每个都要和过滤规则中的任何一个category相同
data
data由mimeType和URI组成
URI的默认值为:content和file
例:
intent.addCategory("com.ryg.category.c");
intent.setDataAndType(Uri.parse("file://abc"),"text/plain");