学习本章你将了解:
Activity的生命周期与工作模式
Activity调用栈管理
8.1、Activity
系统采用activity栈的方式管理activity
8.1.2、Activity的形态
1、active/running :栈的最顶层,并与用户交互
2、paused : 被覆盖,失去了与用户交互的能力,状态、成员变量都保持着,内存不够时,会回收
3、stoped : 完全覆盖,状态、成员变量都保持着
4、killed : 回收或者从未被创建
用户的不同动作,activity会在这4种状态中切换,开发者可以控制生,但是不能控制死
8.1.3、生命周期
activity的周期状态中只有3个是稳定的,其他都是过渡状态
resumed : 也就是之前的active/running状态,处理交互
paused : 一部分被挡住,不接收用户输入
stopped : 完全覆盖,不可见,后台运行
1、启动与销毁的过程
onCreate——onStart——onResume——停在Resume状态,完成启动——调用onDestroy结束生命周期回到killed状态
onCreate :初始化UI
onPause和onStop: 清楚activity资源避免浪费
onDestroy : 线程不会在销毁的时候销毁,所以清楚开启的线程
2、暂停与恢复的过程
当activiy被遮挡,就会调用onPause方法,当结束阻塞后,就会调用onresume恢复
onPause : 释放系统资源,如:Camera,sensor,receivers
onResume : 需要重新初始化在onPause中释放的资源
3、停止与重新创建过程
当内存不足时,处于stoped状态的activity会被系统回收,此时Activity通过onSaveInstans方法保存到Bundle对象中,在onCreate中的参数恢复或者重写onrestoreInstanceState方法
8.3、AndroidMenifest启动模式
standard : 默认的
singleTop : 举个简单的例子,只有一种情况:自己跳自己,如果被覆盖,再跳进来,仍然会创建新的实例
代码如下:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}
public void gotoThis(View view){
startActivity(new Intent(this, SecondActivity.class));
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Toast.makeText(this, "onNewIntent", Toast.LENGTH_SHORT).show();
}
}
资源文件:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="22222"
android:id="@+id/button2"
android:onClick="gotoThis"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="195dp"
android:layout_marginEnd="195dp"
android:layout_marginTop="79dp" />
1、如果在Menifest中设置singleTop
<activity android:name=".chapter8.SecondActivity" android:launchMode="singleTop"></activity>
那么结果就是没有跳转动画,执行的onNewIntent方法
2、如果不设置
那么结果就是有跳转动画,执行的onCreate方法,就像正常跳转activity一样
singleTask : 跟singleTop类似
区别是:singleTop是检查栈顶,而它是检查整个任务栈,如果任务栈中存在你想启动的activity,那么把该activity上面的所有activity都销毁,它就置于栈顶了。
singleInstance : 用于与程序分离的界面,比如调用紧急呼叫
只有一个实例,两个应用共享一个activity实例。
8.4、Intent flag启动模式
Android提供了2种方式设置启动模式,下面通过代码设置
四种常见模式:
Intent.FLAG_ACTIVITY_NEW_TASK;
用在从service启动activity的场景,因为service中没有栈,所以启动要先创建栈
Intent.FLAG_ACTIVITY_SINGLE_TOP;
同menifest中的singleTop
Intent.FLAG_ACTIVITY_CLEAR_TOP;
通menifest中的singleTask
Intent.FLAG_ACTIVITY_NO_HISTORY;
根据英文判断就是无历史的意思,用这种模式启动的activity跳转到其他页面,当前activity的finish了。
比如:A-B,B以这种模式启动C,C再启动D,当前activity栈是ABD
8.5、清空任务栈
在Menifest中的标签中使用以下属性来清理任务栈
clearTaskOnLaunch设置为true : 启动该activity的时候,压在它上面的activity全部被清除。
例如:A设置该属性
A-B,点击home,再进入,效果是B执行onRestart,onDestroy
finishOnTaskLaunch : 如果将根activity的这个属性设置为“true”,一旦其所在的任务栈切换到后台一段时间,系统会直接清除掉这个task栈中的所有activity;
alwaysRetainTaskState : 如果将根activity的这个属性设置为“true”,一旦其所在任务栈切换到后台,即便很长一段时间,系统也不会对其清理,不接收任何清理命令
8.6、Activity任务栈的使用
不可过度的使用任务栈,否则会导致栈混乱,不易维护,要根据项目的需要使用。