目录
一、问题描述
前不久面试Android开发几乎每次都被问:1. Activity的状态有哪几种?2. Activity的生存周期是怎样的?3.从一个Activity A启动一个Activity B,然后再返回Activity A七个回调方法是如何调用的?今天做了个实验,写篇文章记录一下
二、活动的生命周期
以下知识点参考:《第一行代码》郭霖
1. 返回栈
Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,他会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或者调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
2. 活动的状态
- 运行状态:当一个活动处于返回栈的栈顶时,这时活动就处于运行状态,系统最不愿意回收处于此状态的活动。
- 暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态,例如对话框活动之后的活动。只有在内存极低的情况下,系统才会去考虑回收这种活动。
- 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。
- 销毁状态:当一个活动从返回栈中移除后,就变成了销毁状态,系统最倾向于回收处于这种状态的活动。
3. 活动的7个回调方法
- onCreate():在活动第1次被创建的时候调用,在这个方法中完成活动的初始化操作,比如加载布局,绑定事件等。
- onStart():这个方法在活动由不可见变为可见的时候调用。
- onResume():这个方法在活动准备好和用户进行交互的时候调用,此时活动一定处于返回栈栈顶,并且一定处于运行状态。
- onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以保存一些关键数据。
- onStop():这方法在活动完全不可见的时候调用。它和onStop()的区别主要在,如果启动的新活动是一个对话框式的活动,那么onPause()会执行,而onStop()不会执行。
- onDestory():这个方法在活动被销毁之前调用,之后的活动状态将变为销毁状态。
- onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动。
三、Activity A与Activity B之间切换
1. 创建主活动Activity A
创建主活动MainActivity。
设置两个按钮:一个用于点击启动Activity B,一个用于点击启动对话框类型的活动
- 重写剩余六个回调方法,并在其中打印日志
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TAG","A_onCreate");
setContentView(R.layout.activity_main);
Button startNormalActivity=(Button)findViewById(R.id.start_normal_activity);//Activity B
Button startDialogActivity=(Button)findViewById(R.id.start_dialog_activity);//Activity C(对话框)
startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG","A_onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG","A_onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG","A_onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG","A_onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG","A_onDestory");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG","A_onRestart");
}
}
2.创建ActivityB
public class NormalActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal);
Log.d("TAG","B_onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG","B_onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG","B_onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG","B_onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG","B_onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG","B_onDestory");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG","B_onRestart");
}
}
3. 创建Activity C(对话框)
public class DialogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
Log.d("TAG","C_onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG","C_onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG","C_onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG","C_onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG","C_onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG","C_onDestory");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG","C_onRestart");
}
}
4. 实验结果
- 首先启动Activity A,
- 在A中点击按钮启动Activity B
- 返回Activity A
- 启动ActivityC(对话框)
- 从ActivityC(对话框)返回Activity A
多动手,理解得更深刻