Android:日常学习笔记(6)——探究活动(3)
活动的生命周期
返回栈
Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的活动就会重新显现出来。Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合。
默认情况下,每当我们启动一个新的活动,他会在返回栈中入栈,并处于栈顶位置。而每当我们按下Back或者Finish以后,处于栈顶位置的活动会出栈。
活动的状态
运行状态(栈顶的元素)、暂停状态(不在栈顶但仍然可见,如对话框)、停止状态(不在栈顶并完全不可见,有可能被系统回收)、销毁状态(从返回栈中移除后)。
活动的生存期
☐ onCreate():他会在活动第一次被调用的时候创建。
☐ onStart():活动由不可见变为可见时调用。
☐ onResume():活动准备好与用户进行交互时调用,此时活动一定位于返回栈的栈顶。并处于运行状态。
☐ onPause():在系统准备好去启动或者恢复另一个活动的时候调用,一般在此将一些消耗CPU的资源释放掉。
☐ onStop():这个方法在活动完全不可见的时候调用。
☐ onDestory():这个方法在活动被销毁之前调用。
☐ onRestart():这个方法在活动由停止转变为运行状态之前调用,也即是活动被重新启动了。
体验活动的生命周期
1.我们新建三个活动
说明:
对话框活动我们需要在AndroidManifest中进行设置。
2.在主活动中设置启动其余活动,且重载生存期方法
package com.example.zy.android2; import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startNormal = (Button) findViewById(R.id.start_normal_activity);
Button startDialog = (Button) findViewById(R.id.start_dialog_activity);
startNormal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NormalActivity.class);
startActivity(intent);
}
});
startDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
startActivity(intent);
}
});
} protected void onStart()
{
super.onStart();
Log.d("Main","onStart");
}
protected void onResume()
{
super.onResume();
Log.d("Main","onResume");
}
protected void onPause()
{
super.onPause();;
Log.d("Main","onPause");
}
protected void onStop()
{
super.onStop();
Log.d("Main","onStop");
}
protected void onDestroy()
{
super.onDestroy();
Log.d("Main","onDestroy");
}
protected void onRestart()
{
super.onRestart();
Log.d("Main","onRestart");
} }
3.运行程序
我们发现:
当首次运行程序时会打印
03-19 14:36:27.872 3632-3632/com.example.zy.android2 D/Main: onCreate
03-19 14:36:27.872 3632-3632/com.example.zy.android2 D/Main: onStart
03-19 14:36:27.872 3632-3632/com.example.zy.android2 D/Main: onResume
点击第一个按钮会打印:
03-19 14:37:20.270 3632-3632/com.example.zy.android2 D/Main: onPause
03-19 14:37:20.733 3632-3632/com.example.zy.android2 D/Main: onStop
说明:由于NormalActivity活动会完全遮挡Main活动,所以这两个方法完全执行。
返回后打印:
03-19 14:38:11.040 3632-3632/com.example.zy.android2 D/Main: onRestart
03-19 14:38:11.041 3632-3632/com.example.zy.android2 D/Main: onStart
03-19 14:38:11.041 3632-3632/com.example.zy.android2 D/Main: onResume
说明:由于之前Main活动进入停止状态,所以onRestart()方法会得到执行,之后又会依次调用onStart()和onResume()。
点击第二个按钮:
03-19 14:39:17.338 3632-3632/com.example.zy.android2 D/Main: onPause
说明:没有执行onStop,是因为Dialog没有完全遮挡住MainActivity,此时MainActivity只是进入了暂停状态,并没有停止状态。
返回后打印:
03-19 14:39:21.519 3632-3632/com.example.zy.android2 D/Main: onResume
退出MainActivity
03-19 14:39:49.763 3632-3632/com.example.zy.android2 D/Main: onPause
03-19 14:39:49.772 3632-3632/com.example.zy.android2 D/Main: onStop
03-19 14:39:49.772 3632-3632/com.example.zy.android2 D/Main: onDestroy
活动被回收了怎么办
当活动A基础上启动了活动B,那么A进入停止状态,就有可能被系统回收。如果活动A中我们输入了临时数据,那么当从活动B返回时,由于重新执行了onCreate()方法,数据将得不到保存。
Activity提供了一个onSaveInstanceState()回调方法,这个方法可以保证数据回收之前一定被调用,因此我们可以利用这个方法来解决互动被回收时临时数据得不到保存的问题。
//活动重新创建时,可以判断是否有Bundle留下来
protected void onCreate(Bundle savedInstanceState) {
if(savedInstanceState!=null)
Log.d("Main",savedInstanceState.getString("data_key"));
}
//这个方法在活动被系统回收前一定会被调用
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key",tempData);
}