要想理解Activity的生命周期,必先理解Activity的状态。
一、Activity状态
Android官方文档中把Activity分为下面三种状态:
1、Resumed(活动状态)
或者叫Running状态,这个Activity正在屏幕上显示,并且有用户焦点。这个很好理解,就是用户正在操作的那个界面。
2、Paused(暂停状态)
这是一个比较不常见的状态。这个Activity在屏幕上是可见的,但是并不是在屏幕最前端的那个Activity。比如有另一个非全屏或者透明的Activity是Resumed状态,没有完全遮盖这个Activity。
比如下面这个情况,SecondActivity是Resumed状态,但是并未完全覆盖MainActivity,此时MainActivity就是Paused状态。
3、Stopped(停止状态)
当Activity完全不可见时,此时Activity还在后台运行,仍然在内存中保留Activity的状态,并不是完全销毁。
这个也很好理解,当跳转的另外一个界面,之前的界面还在后台,按回退按钮还会恢复原来的状态,大部分软件在打开的时候,直接按Home键,并不会关闭它,此时的Activity就是Stopped状态。
二、Activity生命周期
和Activity生命周期相关的方法有下面几个:
onCreate(Bundle savedInstanceState)
onStart()
onRestart()
onResume()
onPause()
onStop()
onDestroy()
相对来说方法数量比较多,初学者理解起来比较困难。
Android官方文档中把Activity生命周期分为三个区间:
1、The entire lifetime(整个生命周期)
是指在onCreate()和onDestroy()之间的周期。
一个人的一生,就是从出生开始,到死亡的这段时间。Activity生命周期也是一样,从Create开始,直到Destroy,二者在整个生命周期都只有一次。当用户新打开一个界面,此时会调用onCreate(),当用户关闭这个界面,例如按返回键,此时Activity就完全销毁,此时会调用onDestroy()。
这个周期之间包含上面所说的全部状态:Resumed、Paused、Stopped。
2、The visible lifetime(可见的生命周期)
是指在onStart()和onStop()之间的周期,包含在The entire lifetime
之中。在整个生命周期中可能会有多次。
这段周期包含Resumed、Paused两种状态,即两种Activity可见的状态。
当Activity会变为Stopped状态,例如在新的Activity覆盖掉原来的Activity时,会调用onStop()方法,重新回到原来的Activity时,又会调用onStart()。
3、The foreground lifetime(活动生命周期)
是指在onResume()和onPause()之间的周期,包含在The visible lifetime之中。在The visible lifetime中可能会有多次。
这段周期只包含Resumed一种状态,即前端获取焦点用户可操作的状态。
当Activity变为Resumed状态,会调用onResume()方法,反之会调用onPause()方法。
说到这里,还漏了一个onRestart(),很简单,Activity第一次onStart()会在onCreate()之后,如果在整个生命周期中再次onStart(),那么调用onStart()之前会调用onRestart()。
下面分别来进行上面三者的实验:
MainActivity界面上有两个按钮,分别是打开SecondActivity和ThirdActivity:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/secondActivityButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="打开SecondActivity"/> <Button android:id="@+id/thirdActivityButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="打开ThirdActivity"/> </LinearLayout>
在MainActivity.java中,重写生命周期相关方法,加上日志:
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initEvent(); Log.v(TAG, "onCreate"); } @Override protected void onStart() { super.onStart(); Log.v(TAG, "onStart"); } @Override protected void onRestart() { super.onRestart(); Log.v(TAG, "onRestart"); } @Override protected void onResume() { super.onResume(); Log.v(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.v(TAG, "onPause"); } @Override protected void onStop() { super.onStop(); Log.v(TAG, "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.v(TAG, "onDestroy"); } private void initEvent() { // 点击打开SecondActivity Button secondActivityButton = (Button) findViewById(R.id.secondActivityButton); secondActivityButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); // 点击打开ThirdActivity Button thirdActivityButton = (Button) findViewById(R.id.thirdActivityButton); thirdActivityButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, ThirdActivity.class); startActivity(intent); } }); } }
Second分别是两个测试Activity,代码和xml这里不再贴出来了。
最后AndroidManifest.xml:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="com.example.app012.MainActivity" android:label="MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.app012.SecondActivity" android:label="SecondActivity" > </activity> <activity android:name="com.example.app012.ThirdActivity" android:label="ThirdActivity" android:theme="@android:style/Theme.Dialog"> </activity> </application>
这里SecondActivity是一个普通的Activity,ThirdActivity设置android:theme="@android:style/Theme.Dialog",表示它显示为一个对话框,打开ThirdActivity不会完全覆盖MainActivity状态,是用来实验MainActivity的Paused状态的。
实验步骤:
1、
在模拟器中运行程序,此时日志:
onCreate
onStart
onResume
再按返回键退出程序:
onPause
onStop
onDestroy
上面模拟了The entire lifetime整个生命周期,刚打开程序时onCreate到Activity销毁onDestroy。
2、
打开程序后,按“打开SecondActivity”按钮:
onPause
onStop
再按返回键回到MainActivity:
onRestart
onStart
onResume
再按Home键回到桌面:
onPause
onStop
再打开程序:
onRestart
onStart
onResume
以上模拟The visible lifetime,当MainActivity转到后台不可见时调用onStop,再次可见时onStart,由于是再次可见,会调用onRestart。
3、
打开程序后,按“打开ThirdActivity”按钮:
onPause
此时MainActivity没有完全被覆盖:
再按返回键:
onResume
上面模拟The foreground lifetime,失去焦点后onPause,重新得到焦点后onResume。
通过上面实验,可以看出:
The foreground lifetime(onResume到onPause)包含在Thevisible lifetime(onStart到onStop)之中,The visible lifetime包含在The entire lifetime(onCreate到onDestroy)之中。
作者:叉叉哥 转载请注明出处:
http://blog.csdn.net/xiao__gui/article/details/11464603