Android的Activity生命周期模拟程序及解析
當Activity處于Android應用中運行時,它的活動狀態由Android以Activity棧的形式管理。當前活動的Activity位于棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。
Activity大致會經過如下4個狀態:
1.活動狀態:當前Activity位于前臺,用戶可見,可以獲得焦點。也就是位于棧頂的Activity;
2.暫停狀態:其他Activity位于前臺,該Activity仍然可見,只是不能獲得焦點,例如彈出一個對話框;
3.停止狀態:該Activity不可見,失去焦點,例如按Home鍵,切到桌面;
4.銷毀狀態:該Activity結束,或Activity所在的Dalvik進程被結束。
如下圖是Activity生命周期及相關回調方法:
在Activity的生命周期中,如下方法會被系統回調。
onCreate(Bundle savedStatus):創建Activity時會被回調,該方法在整個程序中只會被回調一次;
onStart():啟動Activity時會被回調;
onRestart():重新啟動Activity時被回調;
onResume():恢復Activity時被回調,onStart()方法之后一定會回調該方法;
onPause():暫停Activity時會被回調;
onStop():停止Activity時被回調;
OnDestroy():銷毀Activity時被回調,該方法和onCreate方法一樣,在整個程序中只會被調用一次。
下面是模擬Activity生命周期的一個小Demo。
<LifeCycleActivity.java>
package com.activity.life;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;public class LifeCycleActivity extends Activity {private final String TAG = "--LifeCycleActivity--";private Button start, finish;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);start = (Button) findViewById(R.id.startDialogBn);finish = (Button) findViewById(R.id.finshAppBn);// 輸出日志Log.i(TAG, "-- OnCreate --");start.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(LifeCycleActivity.this, SecondActivity.class);startActivity(intent);}});finish.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLifeCycleActivity.this.finish();}});}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();Log.i(TAG, "-- OnStart --");}@Overrideprotected void onRestart() {// TODO Auto-generated method stubsuper.onRestart();Log.i(TAG, "-- OnRestart --");}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();Log.i(TAG, "-- OnResume --");}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();Log.i(TAG, "-- OnPause --");}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();Log.i(TAG, "-- OnStop --");}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.i(TAG, "-- onDestroy --");} }
布局文件<main.xml>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><Button android:id="@+id/startDialogBn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/startDialogBn" /><Button android:id="@+id/finshAppBn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/finshAppBn" /> </LinearLayout>
這里我用了一個第二個Activity界面來進行第一個Activity不在前臺的操作。第二個Activity?SecondActivity.java,第二個布局文件,second.xml,還有資源文件strings.xml這里就不貼代碼了。
第一步:
當我們部署Android程序到模擬器的時候,我們的程序會從入口Activity(我這里就是LifeCycleActivity)去啟動并自動執行該Activity,我們可以看到LogCat中有如下顯示信息:
可能有人會說onResume()為什么也會被回調。它不是恢復Actiivity時才被回調嗎?之前我也已經說過,在onStart()之后一定會去回調onResume()。這里只是得到了一個驗證。
第二步:
點擊了啟動按鈕。這里是啟動第二個Activity,LogCat中有如下顯示信息:
因為在第二個Activity中我沒有添加任何的日志輸出,所以沒有在第二個Activity中的任何信息。這里我們可以看到,當我們把Activity切換到第二個Activity時,也就是說該Activity不在前臺,且不可見時,這個Activity就停止了,依次回調了onPause()方法和onStop()方法。
第三步:
在第二個Activity中點擊了返回按鈕,或是直接點擊模擬器的返回鍵。LogCat中有如下顯示信息:
當我們的第一個Activity重新顯示在前臺時,系統回調了onRestart(),onStart()和onResume()方法。
第四步:
點擊Home鍵,桌面程序位于前臺。LogCat中有如下顯示信息:
第五步:
從桌面再次啟動程序。LogCat中有如下顯示信息:
我們可以看到,從桌面再次啟動程序和從第二個Activity返回到第一個Activity時,系統的回調過程是一樣的。
第六步:
點擊退出程序按鈕,退出程序。
通過這個模擬程序和相關操作的相應輸出,應該是能夠很清晰反應了Activity生命周期的狀態及在不同狀態之間切換時所回調的方法。
參考資料:《Android瘋狂講義》
總結
以上是生活随笔為你收集整理的Android的Activity生命周期模拟程序及解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Android的EditText焦点
- 下一篇: Android程序如何实现从网络中获取一