活动的生命周期
1.活动状态
通过利用返回栈来实现销毁活动,每当按下Back或者调用finish()方法销毁活动时,会显示栈顶活动。
状态 | 解释 | 回收 |
---|---|---|
运行状态 | 位于栈顶的活动 当前处于最上层,能看见的活动 | 系统最不愿意回收的状态, 回收了会给用户带来极差的体验 |
暂停状态 | 不是位于栈顶,但仍可见 (类似位于对话框下一层的活动,还能看得见) | 当内存极低的时候, 系统才会考虑回收这种活动 |
停止状态 | 不位于栈顶,完全不可见 (即处于后台运行状态) | 当其他地方需要内存时, 可以回收这种活动 |
销毁状态 | 从返回栈移除 | 系统最倾向于回收这种状态 |
2.活动的生存期
Activity定义了7个回调方法
方法名 | 用途 |
---|---|
onCreate() | 在此方法中完成活动的初始化操作(类似加载布局、绑定事件等) |
onStrat() | 活动从不可见到可见时调用 |
onResume() | 活动准备好与用户进行交互时调用,此时活动一定位于返回栈栈顶,处于运行状态 |
onPause() | 系统准备启动或恢复另一个活动时调用(释放资源,保存关键数据,执行速度必须快) |
onStop() | 活动完全不可见时调用 |
onDestory() | 活动被销毁之前调用 |
onRestart() | 活动从停止状态到运行状态时调用,Restart(重启) |
方法除了onRestart()作为重启之外,其他两两对应把活动分为3中生存期
生存期 | 起始 |
---|---|
完整生存期 | onCreate() -----> onDestory(),前者完成初始化,后者释放内存 |
可见生存期 | onStart() -----> onStop(),活动总是可见(有可能无法交互) |
前台生存期 | onResume() -----> onPause(),活动总是处于运行状态,可交互 |
活动从启动到销毁的流程图如下:
保存被回收活动的临时数据用onSaveInstanceState()------类似Intent的用法
3.活动的启动模式
有四种,通过AndroidManifest.xml中给< activity >标签指定android:launchMode属性来选择
模式 | 解释 | 优劣 |
---|---|---|
standard | 启动另一活动时,当前活动入返回栈,位于栈顶 | 默认模式 |
singleTop | 要启动另一活动时,先检测返回栈栈顶活动是否与要启动的相同,是则直接从栈中返回活动,不是则当前活动入返回栈,启动新活动 | 减少重复创建栈顶活动 |
singleTask | 启动另一活动时,先检测返回栈栈中活动,存在该活动实例则将该活动之上的所有活动出栈,并直接使用该实例,不存在则当前活动入栈,启动新活动 | 避免浪费栈中空间,重复启动已经存在实例的活动 |
singleInstance | 启用新的返回栈管理此活动 | 解决共享栈中活动实例的问题 |
4.退出程序(关闭所有活动)
思路:
用一个专门的集合类管理所有活动即可
用List存活动,启动活动就add,关闭活动就remove,关闭所有活动就finish
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity :activities){
if(!activity.isFinishing())
activity.finish();
}
android.os.Process.killProcess(android.os.Process.myPid());
}
}
为保证程序完全退出,可以在销毁所有活动后加上杀死当前进程的代码:
android.os.Process.killProcess(android.os.Process.myPid());