Android群英传笔记——第八章:Activity与Activity调用栈分析
开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲
- Activity的生命周期与工作模式
- Activity调用栈管理
一.Activity
Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期
1.起源
Activity是用户交互的第一接口,他提供了一个用户完成指令的窗口,当开发者创建Activity之后,通过调用setContentView来指定一个窗口界面,并以此为基础,提供给用户交互的接口,系统采用Activity栈的方式来管理Activity
2. Activity形态
Activity一个最大的特点就是拥有多种形态,他可以在多种形态中自由切换,以此来控制自己的生命周期
- Activity/Running
这个时候,Activity处于Activity栈的最顶层,可见,并与用户进行交互
- Paused
Activity失去焦点,被一个新的非全屏的Activity或者一个透明的Activity放置在栈顶时,Activity就转换成了qaused形态,他是去了与用户交互的能力,所有状态信息,成员变量都还保留着,只有在系统内存极地的情况下,才会被系统回收
- Stopped
如果一个Activity被另一个Activity完全覆盖,那么Activity就会进入stop形态,此时他不在可见,但依然保留着所有的状态和成员变量
- Killed
当Activity被系统回收或者Activity从来没有创建过,Activity就处于killed状态,
由此可见,用户的不同操作,会让Activity进入四种不同的状态,而开发者,只能控制其生,却不能控制其死
3.生命周期
Google给了我们一张图来表示Activity的生命周期,他希望Activity能被开发者所控制,而不是一匹脱缰的野马
开发者必然不必实现所有的生命周期方法,但是必须知道每一个生命周期的含义,可以让我们更好的掌控Activity,让他能完成你所期望的效果
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
-1.Activity启动和销毁过程
在系统调用onCreate方法之后,就会马上调用onStart,然后继续调用onResume来进图运行状态,最后都会停在onResume状态,完成启动,系统会调用onDestroy来结束一个Activity的生命周期让他毁掉kill状态
以上就是一个Activity的启动和销毁的过程
- onCreate中创建基本的UI元素
- onPause和onStop:清除Acvtivity的资源,避免浪费
- onDestroy:因为引用会在Activity销毁的时候销毁,而线程不会,所以清除开启的线程
-2.Activity的暂停和恢复过程
当栈顶的Activity部分不可见的时候,就会倒置Activity进入onPause
- onPause:释放系统资源,
- onResume:需要重新初始化onPause释放的资源
-3. Activity的停止过程
栈顶的Activity部分不可见的时候,实际上后续会有两种可能,从部分不可见到可见,也就是恢复过程,从部分不可见到完全不可见,也就是停止过程,系统在当前Activity不可见的时候调用onPause
-4.Activity的重新创建过程
最后我们来看看Activity是如何重新创建的,如果你的系统长时间处于stop的状态,而此时系统需要更多的内存或者系统内存比较紧张的时候,系统就会回收你的Activity,而系统为了补偿你,会将你的Activity状态通过onRestoreInstanceState()方法保存到Bundle中去,当然你也可以额外增加键值对去保存这些状态,当你重新需要创建这个Activity的时候,保存的Bundle对象就会传递到Activity的onRestoreInstanceState()方法中去与onCreate方法中去,这也是onCreate的重要参数——saveInstanceState的来源
不过这里要注意的一点就是savedInstanceState方法并不是每次当Activity离开前台就会调用,如果用户使用finish方法结束,则不会调用,而且Android系统已经默认实现了控件的缓存状态,一次来减少开发者需要实现的缓存逻辑
二.Android任务栈简介
一个Android应用程序功能通常会被拆分为多个Activity,而各个Activity之间通过Intcnt进行连接,而Android系统,通过栈结构来保存整个App的Activity,栈底的元素是整个任务栈的发起者。一个合理的任务调度栈不仅是性能的保证, 更是提供性能的基础。
当一个App启动时,如果当前环境中不存在该App的任务栈,那么系统就会创建一个任务栈,这个app所启动的Activity都将在这个任务栈中被管理,这个栈也被称为Task