Activity的生命周期
1. 概述
应用场合:
Activity在运行时会受到一些突然事件的影响,例如:你正使用一个Activity,突然来了一个电话,这时你的应用就要具备处理这些突然事件的能力,要处理这些突然事件,需要用到Activity的生命周期。
Activity有三个状态:
当Activity在屏幕前台时(位于当前任务堆栈的顶部),它处于激活或运行状态。它可以响应用户操作。
当Activity上面有另外一个Activity,上面的Activity没有完全覆盖它,或者上面的activity是透明的,
这时下方的Activity仍然对用户可见,下方的Activity就处于暂停状态。
被暂停的Activity仍然对用户可见,并且是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接)。
如果系统处于内存不足时会杀死这个Activity。
*当Activity完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。
然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。
3. 图,这张图比什么都清楚,文档位置在docs/reference/android/app/Activity.html,建议能看英文的哥们直接看文档去,说得太清楚了:
2.当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:
voidonCreate(Bundle savedInstanceState) //第一次创建是调用。在Acticity整个生命周期只会被调用一次
void onStart() // onCreate 调用之后就会调用onStart
void onRestart()
void onResume() // onStart 之后调用onRestart。此方法之后Acticity 处于运行(激活)状态。
void onPause() /* 当一个新的Activity 被打开后,原来的Activity 就会调用这个状态。
*如果新打开的Activity 并没有完全覆盖原来的Activity。或者新的Activity 是半透明状态,
*原来的Activity 还可以见。那么就只会调用这个方法,使Activity 处于暂停状态,否则,继续往下调用stop */
void onStop() // 当一个新的Activity 被打开之后,而原来的Activity 被它覆盖掉时,在调完onPause 方法后,就会调用 onStop,使Activity 处于停止状态
void onDestroy()
* 当Activity 处于暂停状态时。即它的上方有另一个活动的Activity。(例如,新的Activity 以对话框形式出现)
当用户点击“后退”按钮,即将上方的Acticity 关掉了。
这时候,将调用onResume 方法。使Acticity 重新处于运行(激活)状态。
只触发一个方法。
* Activity处于停止状态。即它被一个新的Activity 覆盖掉了。
用户通过Activity 回到了前面的一个Activity。将调用其onRestart 方法。
然后调用onStart 方法。
再调用onResume 方法。此方法之后Acticity 重新处于运行(激活)状态。
触发了三个方法。
* 当一个Activity 处于暂停状态 或 停止状态时。
此时,操作系统内存缺乏,它可能会杀死处于这个状态的Activity 。回收内存。
此时用户通过“后退”按钮回到前一个Activity 时,相当于重新执行一遍最开始的线路。从onCreate 方法开始。
* 当Activity 被销毁的时候,将调用onDestroy
特别注意:在覆盖以上七个方法时,千万不能忘了调用super....不能覆盖了它本身的功能。
3. 试验
view plaincopy toclipboardprint?
public class MainActivityextends Activity {
private static finalString TAG = "MainActivity";
@Override
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG,"onCreate...");
/* 点击按钮时,切换到另一个Activity,这个 Activity 将会把当前MainActivity 覆盖,使其处于停止状态。*/
findViewById(R.id.button).setOnClickListener(newView.OnClickListener() {
public voidonClick(View v) {
Intent intent= new Intent(MainActivity.this, OtherActivity.class);
startActivity(intent);
}
});
}
@Override
protected voidonStart() {
Log.i(TAG,"onStart...");
super.onStart();
}
@Override
protected voidonRestart() {
// TODOAuto-generated method stub
super.onRestart();
Log.i(TAG,"onRestart...");
}
@Override
protected voidonResume() {
Log.i(TAG,"onResume...");
super.onResume();
}
@Override
protected voidonPause() {
Log.i(TAG,"onPause...");
super.onPause();
}
@Override
protected voidonStop() {
Log.i(TAG,"onStop...");
super.onStop();
}
@Override
protected voidonDestroy() {
Log.i(TAG,"onDestroy...");
super.onDestroy();
}
}
** 当MainActivity 第一次创建时,分别依次调用了onCreate、onStart、onResume
** 当点击按钮切换到OtherActivity 时,调用了onPause、onStop方法。使OtherActivity 处于停止状态
** 当在OtherActivity 点击后退,回到MainActivity 时。Activity由停止状态切换到运行状态。调用了onRestart、onStart、onResume方法
修改试验
新添加一个ThreeActivity,使其打开方式为对话框样式的Activity:
view plaincopy toclipboardprint?
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG,"onCreate...");
/* 打开一个覆盖MainActivity 的Activity*/
findViewById(R.id.button).setOnClickListener(newView.OnClickListener() {
public voidonClick(View v) {
Intent intent= new Intent(MainActivity.this, OtherActivity.class);
startActivity(intent);
}
});
/* 打开一个对话框样式的 Activity,位于MainActivity 上方。并不覆盖 MainActivity。*/
findViewById(R.id.button2).setOnClickListener(newView.OnClickListener() {
public voidonClick(View v) {
Intent intent= new Intent(MainActivity.this, ThreeActivity.class);
startActivity(intent);
}
});
}
** 怎样设置ThreeActivity,为对话框样式
AndroidManifest.xml
<activityandroid:name=".ThreeActivity" android:label="第三个Activity" android:theme="@android:style/Theme.Dialog"/>
** 当点击“打开第三个 Activity” 使ThreeActivity弹出,但不覆盖MainActivity
调用了onPause方法
** 点击后退按钮回到MainActivity 调用了onResume 一个方法
4. 关注系统杀死Activity 的情况
当Activity 处于暂停或停止状态下,操作系统内存缺乏可能会销毁Activity 。或者其它意外突发情况,Activity被操作系统销毁。内存回收时。
应该按业务需求,处理这种情况。例如,若有比较重要的数据,但是数据还处在运算中,则应该缓存它们。若数据已经是运算完毕的最终数据,则应该对它们进行持久化操作:例如保存到数据库,写往磁盘文件等。
Activity提供了两个事件方法可以实现我们的这种需求:
onSaveInstanceState()和onRestoreInstanceState()方法
系统销毁一个Activity时,onSaveInstanceState()会被调用
但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。
onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存
view plaincopy toclipboardprint?
public classPreferencesActivity extends Activity {
private Stringname;
protected voidonRestoreInstanceState(Bundle savedInstanceState) {
name =savedInstanceState.getString("name"); //被重新创建后恢复缓存的数据
super.onRestoreInstanceState(savedInstanceState);
}
protected voidonSaveInstanceState(Bundle outState) {
outState.putString("name","liming");//被摧毁前缓存一些数据
super.onSaveInstanceState(outState);
}
}
5. onPause 和onResume
** 无论新的Activity 是覆盖还是暂停原来的Activity,都会调用原来的Activity 的onPause 方法
** 无论新的Activity 是覆盖还是暂停原来的Activity,在原来的Activity 重新回到前台的时候,都会调用它的onResume 方法。