Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android技術基礎 >> 78章、Activity生命周期(從零開始學Android)

78章、Activity生命周期(從零開始學Android)

編輯:Android技術基礎

android開發不能不知activity生命周期,理解Activity的生命周期對應用程序開發來說是至關重要的,這樣才能確保您的應用提供了一個很好的用戶體驗和妥善管理其資源。

\

Activity狀態

隨著Activity的創建和銷毀,也就會進出棧如上圖所示,其中可能會經歷以下四種狀態:

  • Active狀態:這時候Activity處於棧頂,且是可見的,有焦點的,能夠接收用戶輸入前景Activity。OPhone Runtime將試圖不惜一切代價保持它活著,甚至殺死其他Activity以確保它有它所需的資源。當另一個Activity變成Active時,當前的將變成Paused狀態。
  • Paused狀態:在某些情況下,你的Activity是可見的,但沒有焦點,在這時候,Actvity處於Paused狀態。例如,如果有一個透明或非全屏幕上的Activity在你的Actvity上面,你的 Activity將。當處於Paused狀態時,該Actvity仍被認為是Active的,但是它不接受用戶輸入事件。在極端情況下,OPhone Runtime將殺死Paused Activity,以進一步回收資源。當一個Actvity完全被遮住時,它將進入Stopped狀態。
  • Stopped 狀態:當Activity是不可見的時,Activity處於Stopped狀態。Activity將繼續保留在內存中保持當前的所有狀態和成員信息,假設系統別的地方需要內存的話,這時它是被回收對象的主要候選。當Activity處於Stopped狀態時,一定要保存當前數據和當前的UI狀態,否則一旦Activity退出或關閉時,當前的數據和UI狀態就丟失了。
  • Inactive狀態:Activity被殺掉以後或者被啟動以前,處於Inactive狀態。這時Activity已被移除從Activity堆棧中,需要重新啟動才可以顯示和使用。

下面再通過一個比喻來看兩個Activity的切換過程。

我們把Activity比作一本書,我們要看書,首先從書架上取出書(onCreate),然後放到桌上(onStart),接著打開書(onResume),這樣我們就可以看書並可以在書本上寫字了。

如果這時候我們要啟動另一個Activity,也就是要看另一本書,首先我們放下手中的筆或者說合上書(onPause),然後從書架上拿下另一本書(書2:onCreate),然後把書本2放到桌上並打開(書2:onStart、onResume)。

如果書本1被書本2完全蓋住了,即不可見了,就調用書本1的onStop;而如果書本2較小,沒有完全蓋住書本1,則不會調用。

我們還可以把書本1放回書架上,即onDestroy。

另外,還有一點要注意,Activity在處於onPause、onStop、onDestroy狀態下,系統都可以銷毀該Activity所在進程,所以我們在處理一些要保存的數據時,必須在onPause方法中進行,因為onStop和onDestroy方法不一定會被調用。

 

 一、設計界面

1、MainActivity布局文件

打開res/layout/activity_main.xml文件。
輸入以下代碼:

[html] view plain copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <Button  
  9.         android:id="@+id/open"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="打開OtherActivity" />  
  13.   
  14. </LinearLayout>  


2、OtherActivity布局文件

打開res/layout/activity_other.xml文件。
輸入以下代碼:

[html] view plain copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <Button  
  9.         android:id="@+id/back"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="返回MainActivity" />  
  13.   
  14. </LinearLayout>  

 

二、程序文件

1、MainActivity.java

打開“src/com.genwoxue.activitylifecycle/MainActivity.java”文件。
然後輸入以下代碼:

[java] view plain copy  
  1. package com.genwoxue.activitylifecycle;  
  2.   
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9.   
  10. public class MainActivity extends Activity {  
  11.   
  12.     private Button btnOpen=null;  
  13.       
  14.       
  15.     //當Activity程序啟動之後,首先調用onCreate()  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.   
  19.         System.out.println("[M]MainActivity:onCreate()執行");  
  20.           
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.           
  24.         btnOpen=(Button)super.findViewById(R.id.open);  
  25.         btnOpen.setOnClickListener(new OnClickListener(){  
  26.             @Override  
  27.             public void onClick(View view){  
  28.                   
  29.                 System.out.println("[M]MainActivity程序執行");  
  30.                 Intent intent=new Intent(MainActivity.this,OtherActivity.class);  
  31.                 MainActivity.this.startActivity(intent);  
  32.             }  
  33.         });  
  34.     }  
  35.   
  36.     //當為用戶第一次顯示界面時調用onCreate()  
  37.     @Override  
  38.     protected void onStart(){  
  39.         System.out.println("[M]MainActivity:onStart()執行");  
  40.         super.onStart();  
  41.     }  
  42.       
  43.     //當攻得用戶焦點時調用onResume()  
  44.     @Override  
  45.     protected void onResume(){  
  46.         System.out.println("[M]MainActivity:onResume()執行");  
  47.         super.onResume();  
  48.     }  
  49.       
  50.     //當啟動其他Activity程序時調用此方法,用於進行數據的提交、動畫處理等操作。  
  51.     @Override  
  52.     protected void onPause(){  
  53.         System.out.println("[M]MainActivity:onPause()執行");  
  54.         super.onPause();  
  55.     }  
  56.       
  57.     //當一個Activity程序完全不可時調用onStop(),此時並不會銷毀Activity程序。  
  58.     @Override  
  59.     protected void onStop(){  
  60.         System.out.println("[M]MainActivity:onStop()執行");  
  61.         super.onStop();  
  62.     }  
  63.           
  64.     //Activity程序停止後再次顯示給用戶時onRestart()  
  65.     @Override  
  66.     protected void onRestart(){  
  67.         System.out.println("[M]MainActivity:onRestart執行");  
  68.         super.onRestart();  
  69.     }  
  70.   
  71.     //程序被銷毀時調用onDestroy():當調用finish()方法或系統資源不夠用時將調用此方法。  
  72.     @Override  
  73.     protected void onDestroy(){  
  74.         System.out.println("[M]MainActivity:onDestroy執行");  
  75.         super.onDestroy();  
  76.     }  
  77.   
  78. }  


2、OtherActivity.java

打開“src/com.genwoxue.activitylifecycle/OtherActivity.java”文件。
然後輸入以下代碼:

[java] view plain copy  
  1. package com.genwoxue.activitylifecycle;  
  2.   
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9.   
  10. public class OtherActivity extends Activity {  
  11.   
  12.     private Button btnBack=null;  
  13.       
  14.       
  15.     //當Activity程序啟動之後,首先調用onCreate()  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.   
  19.         System.out.println("[O]OtherActivity:onCreate()執行");  
  20.           
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_other);  
  23.           
  24.           
  25.           
  26.         btnBack=(Button)super.findViewById(R.id.back);  
  27.         btnBack.setOnClickListener(new OnClickListener(){  
  28.             @Override  
  29.             public void onClick(View view){  
  30.                   
  31.                 System.out.println("[O]OtherActivity程序執行");  
  32.                   
  33.                 Intent intent=new Intent(OtherActivity.this,MainActivity.class);  
  34.                 OtherActivity.this.startActivity(intent);  
  35.             }  
  36.         });  
  37.     }  
  38.   
  39.     //當為用戶第一次顯示界面時調用onCreate()  
  40.     @Override  
  41.     protected void onStart(){  
  42.         System.out.println("[O]OtherActivity:onStart()執行");  
  43.         super.onStart();  
  44.     }  
  45.       
  46.     //當攻得用戶焦點時調用onResume()  
  47.     @Override  
  48.     protected void onResume(){  
  49.         System.out.println("[O]OtherActivity:onResume()執行");  
  50.         super.onResume();  
  51.     }  
  52.       
  53.     //當啟動其他Activity程序時調用此方法,用於進行數據的提交、動畫處理等操作。  
  54.     @Override  
  55.     protected void onPause(){  
  56.         System.out.println("[O]OtherActivity:onPause()執行");  
  57.         super.onPause();  
  58.     }  
  59.       
  60.     //當一個Activity程序完全不可時調用onStop(),此時並不會銷毀Activity程序。  
  61.     @Override  
  62.     protected void onStop(){  
  63.         System.out.println("[O]OtherActivity:onStop()執行");  
  64.         super.onStop();  
  65.     }  
  66.           
  67.     //Activity程序停止後再次顯示給用戶時onRestart()  
  68.     @Override  
  69.     protected void onRestart(){  
  70.         System.out.println("[O]OtherActivity:onRestart執行");  
  71.         super.onRestart();  
  72.     }  
  73.   
  74.     //程序被銷毀時調用onDestroy():當調用finish()方法或系統資源不夠用時將調用此方法。  
  75.     @Override  
  76.     protected void onDestroy(){  
  77.         System.out.println("[O]OtherActivity:onDestroy執行");  
  78.         super.onDestroy();  
  79.     }  
  80.   
  81. }  


三、配置文件

打開“AndroidManifest.xml”文件。

然後輸入以下代碼:

[html] view plain copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.genwoxue.activitylifecycle"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="10"  
  9.         android:targetSdkVersion="15" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.genwoxue.activitylifecycle.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.           
  26.        <span style="color:#ff0000;"><strong> <activity  
  27.             android:name="com.genwoxue.activitylifecycle.OtherActivity"  
  28.             android:label="@string/app_name" >  
  29.         </activity></strong>  
  30. </span>    </application>  
  31.   
  32. </manifest>  

 

注意:多Activity需要在AndroidManifest.xml文件中添加以下代碼:

<activity
            android:name="com.genwoxue.activitylifecycle.OtherActivity"
            android:label="@string/app_name" >
        </activity>

四、運行結果

1、第一種情況:運行ActivityLifeCycle—>按“Back”返回鍵:

(1)第一步,創建message過濾器

單擊“+”號按鈕,並在Logcat Message Filter Settings進行如下設置;

\ \

(2)第二步,選中LogCat中的“Main”。 

\

(3)第三步,運行主Activity;之後再按“Back”手機返回鍵。
\

\

我們認真觀察(結合Activity生命周期圖):

A、第一次運行ActivityLifecycle程序:onPause()、onStop()、onDestroy()執行(上圖紅色背景部分,圖示①)
B、按下“Back”鍵:onPause()、onStop()、onDestroy()執行(上圖藍色背景部分,圖示②)

至此,完成了一個完整的生命周期。


2、第二種情況:運行ActivityLifeCycle—>按“Home”鍵—>再次激活ActivityLifeCycle

(1)第一步,選中LogCat中的“Main”。

\

(2)第二步,運行主Activity;之後再按“Home”鍵;之後再激活ActivityLifeCycle。
\

\

我們認真觀察(結合Activity生命周期圖):

A、第一次運行ActivityLifecycle程序:onPause()、onStop()、onDestroy()執行(上圖紅色背景部分,圖示①)
B、按下“Home”鍵:onPause()、onStop()(上圖綠色背景部分,圖示②)(注意雖然ActivityLifecycle不可見了,但onDestroy()並沒有執行,這意味著還有機會重新回到前台執行)

C、再次激活ActivityLifecycle程序:onRestart()、onStart()、onResume()執行(上圖藍色背景部分,圖示③)(注意激活和第一次運行區別,第一次運行執行了onCreate(),而激活則是onRestart())

至此,重新進入到正常的運行狀態。

以上兩種情況實際上僅僅執行了ActivityLifecycle應用程序中的MainActivity,下面我們學習多個Activity進行交互的生命周期。

 

3、第三種情況:運行ActivityLifeCycle之MainActivity—>單擊“打開OtherActivity”按鈕—>單擊“返回MainActivity”

(1)第一步,創建message過濾器

單擊“+”號按鈕,並在Logcat Message Filter Settings進行如下設置;

\ \

(2)第二步,運行MainActivity;再單擊“打開OtherActivity”;再單擊“返回MainActivity”。

\ \ \

\

我們認真觀察(結合Activity生命周期圖):

A、第一次運行MainActivity:[M]MainActivity之onPause()、onStop()、onDestroy()執行(上圖紅色背景部分,圖示①)
B、單擊“打開OtherActivity”按鈕:(上圖綠色背景部分,圖示②)

從MianActivity到OtherActivity過程中,我們看到:
Ⅰ、MainActivity從運行狀態,到onPause();
Ⅱ、緊接著[O]OtherActivity執行了onCreate()、onStart()、onResume(),也就意味著此時,OtherActivity接管,其進入了正常的運行態;
Ⅲ、之後MainActivity執行了onStop()狀態。

C、單擊“返回MainActivity”按鈕:(上圖藍色背景部分,圖示③)
從OtherActivity再到MianActivity過程中,我們看到:
Ⅰ、OtherActivity從運行狀態,到onPause();
Ⅱ、緊接著[M]MainActiviy執行了onCreate()、onStart()、onResume(),也就意味著此時,MainActivity接管,其進入了正常的運行態;
Ⅲ、之後OtherActivity執行了onStop()狀態。

以上為多個Activity切換,其生命周期過程。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved