1、Activity的四种状态
理解Activity的生命周期之前,先理解对android的生命周期的特点进行整理,从而归纳出的Activity的四种活动状态。
那么,通常来说,一个Activity的整个生命周期内,会经历如下的几种状态:
- 运行状态:
* 当一个Activity位于返回栈栈顶的时候,既是处于这种状态之下。
PS:系统最不愿意回收处于运行状态下的Activity,因为这回给用户造成很糟糕的体验
- 暂停状态:
* 当一个Activity不再位于栈顶,但却又处于“用户可见”的状态下的时候,既是位于暂停状态。
通常我们理解,一个Activity被另一个Activity“压栈”,而离开栈顶,既是有一个新的“界面视图”进入。
那么什么时候一个Activity会出现不再位于栈顶,却又被用户可见的情况呢?
Android中,并不是所有的活动都会占满整个屏幕,例如新压入栈顶的Activity是一个对话框形式的活动时,前一个Activity则会进入到这种所谓的暂停状态。
暂停状态下的Activity无法响应用户的操作,但仍然是被用户可见的,所以系统仍然不愿意去回收此状态下的Activity。
- 停止状态:
* 当一个Activity不再位于栈顶,并且不再被“用户可见”的时候,就进入到了停止状态。
PS:处于停止状态的活动最大的特点是:系统仍然为其保存相应的状态和成员变量,但这并不是绝对可靠的。
这是因为位于该种状态下的Activity,在一些其他优先级更高的程序需要内存的时候,系统会选择回收释放掉该状态下的Activity,以提供足够的内存。
所以,如果在你的某个Activity中,如果有一些该活动重新回到栈顶时,需要“重现”的数据的话,
为了避免这种状态下的意外发生,可以选择在onSaveInstanceState()方法中保存信息,在下次活动恢复的时候从onCreate()方法中进行恢复,避免数据丢失。
- 销毁状态:
* 当一个活动从返回栈中被移除时,就处于销毁状态了。系统最倾向于回收这种活动,以保存手机内存的充足。
2、Activity的7种生命周期方法的理解
前面说到了所谓的四种活动状态,其实就是根据Android的生命周期的各个阶段的特点归纳出来的,所以我们自然也应该理解这7种生命周期的特点,它们分别是:
- onCreate()
* 在一个活动初次被创建时调用.
* 通常应该在这个方法里完成活动的初始化事件,如:加载布局,初始化控件,绑定事件等等..
- onStart()
* 在活动由不可见变为可见时调用.
- onResume()
* 当一个活动准备好和用户进行交互时进行调用。此时的活动一定位于返回栈的顶端,处于运行状态。
- onPause()
* 在系统准备去启动或恢复另一个活动的时候调用。
* 通常在这个方法内将一些消耗CPU的资源释放,以及保存一些关键数据。
* 但该方法内的内容执行速度一定要快,也就是说不要在此方法内做耗时操作,否则会影响新的栈顶活动的使用。
- onStop()
* 在活动完全不可见的时候调用。
* 和onPause的调用特点类似,但最大的不同在于,例如:
从当前活动启动的是一个对话框形式的Activity,onPause会得到调用,而onStop不会调用。
- onRestart()
* 这个方法在活动由停止状态变为运行状态之前调用,也就是重新启动。
- onDestroy()
* 在活动即将被销毁之前调用,调用完毕后该活动进入销毁状态。
3、Activity生命周期图
为了更好的对Android中一个Activity在实际运行过程中,生命周期阶段变化的理解,我们结合官方的说明图加深印象。
从这张图中,我们可以归纳得到以下几种情况:
1、当一个Activity初次被创建时,会经过onCreate → onStart → onResume,此时该活动便已经压入栈顶,进入到了运行状态。
2、此时如果有另一个Activity来到前台,可分为我们上面说到的两种情况:
- 新进入前台的是“对话框式”的Activity,此时onPause方法被调用,活动进入到暂停状态。而当活动再次返回时,直接调用onResume方法后恢复到运行状态。
- 新进入前台的是普通的Activity,此时当前我们的Activity进入到不可见状态,经历onPause → onStop方法后,进入停止状态;若再次返回,则经历onRestart → onStart → onResume后,重新启动进入到运行状态。
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class LifeCycleTestMainActivity extends Activity {
private final String TAG = "LifeCycleTestMainActivity";
private Button start_normal_activity;
private Button start_dialog_activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "onCreate...");
super.onCreate(savedInstanceState);
this.setContentView(R.layout.life_cycle_main_layout);
// 恢复数据
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("tempData");
// do something...
}
initView();
}
private void initView() {
start_normal_activity = (Button) this.findViewById(R.id.start_normal_activity);
start_dialog_activity = (Button) this.findViewById(R.id.start_dialog_activity);
start_normal_activity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LifeCycleTestMainActivity.this, LifeCycleNormalActivity.class);
startActivity(intent);
}
});
start_dialog_activity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LifeCycleTestMainActivity.this, LifeCycleDialogActivity.class);
startActivity(intent);
}
});
}
// 保存临时数据,避免活动进入到“停止状态”时,被系统回收,数据消失的问题
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempDate = "some temp data have need saved";
outState.putString("tempData", tempDate);
}
@Override
protected void onStart() {
Log.v(TAG, "onStart...");
super.onStart();
}
@Override
protected void onResume() {
Log.v(TAG, "onResume...");
super.onResume();
}
@Override
protected void onPause() {
Log.v(TAG, "onPause...");
super.onPause();
}
@Override
protected void onStop() {
Log.v(TAG, "onStop...");
super.onStop();
}
@Override
protected void onRestart() {
Log.v(TAG, "onRestart...");
super.onRestart();
}
@Override
protected void onDestroy() {
Log.v(TAG, "onDestroy...");
super.onDestroy();
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/start_normal_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="start normal activity"
android:textSize="20sp" />
<Button
android:id="@+id/start_dialog_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/start_normal_activity"
android:text="start dialog activity"
android:textSize="20sp" />
</RelativeLayout>
<activity android:name=".LifeCycleDialogActivity" android:theme="@android:style/Theme.Dialog"/>
搞定,接下来我们运行程序,进行测试:
很高兴,依然与我们料想的一样,从暂停状态中恢复,我们只经历了一步:onResume.
事实上,我们此时再次点击回退键的时候,我们最直观看到的就是:"屏幕返回到了系统的主界面"。