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来到前台,可分为我们上面说到的两种情况:
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"/>