Activity生命周期詳解 – Android移動開發技術文章_手機開發 Android移動開發教學課程

學習並掌握Activity生命周期,對從事Android開發(或者打算日後從事這方面的開發工作)的朋友來講,是至關重要的。本文將用圖解和實例的方式,向大傢詳細講解Activity生命周期的有關知識。
Activity有三個狀態:
1.當它在屏幕前臺時(位於當前任務堆棧的頂部),它是激活或運行狀態。它就是響應用戶操作的Activity。
2.當它上面有另外一個Activity,使它失去瞭焦點但仍然對用戶可見時(如圖),它處於暫停狀態。在它之上的Activity沒有完全覆蓋屏幕,或者是透明的,被暫停的Activity仍然對用戶可見,並且是存活狀態(它保留著所有的狀態和成員信息並保持和窗口管理器的連接)。如果系統處於內存不足時會殺死這個Activity。

3.當它完全被另一個Activity覆蓋時則處於停止狀態。它仍然保留所有的狀態和成員信息。然而對用戶是不可見的,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個Activity。
當Activity從一種狀態轉變到另一種狀態時,會調用以下保護方法來通知這種變化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
 
這七個方法定義瞭Activity的完整生命周期。實現這些方法可以幫助我們監視其中的三個嵌套生命周期循環:
Activity的完整生命周期自第一次調用onCreate()開始,直至調用onDestroy()為止。Activity在onCreate()中設置所有“全局”狀態以完成初始化,而在onDestroy()中釋放所有系統資源。例如,如果Activity有一個線程在後臺運行從網絡下載數據,它會在onCreate()創建線程,而在 onDestroy()銷毀線程。
 
 Activity的可視生命周期自onStart()調用開始直到相應的onStop()調用結束。在此期間,用戶可以在屏幕上看到Activity,盡管它也許並不是位於前臺或者也不與用戶進行交互。在這兩個方法之間,我們可以保留用來向用戶顯示這個Activity所需的資源。例如,當用戶不再看見我們顯示的內容時,我們可以在onStart()中註冊一個BroadcastReceiver來監控會影響UI的變化,而在onStop()中來註消。onStart() 和 onStop() 方法可以隨著應用程序是否為用戶可見而被多次調用。
 
 Activity的前臺生命周期自onResume()調用起,至相應的onPause()調用為止。在此期間,Activity位於前臺最上面並與用戶進行交互。Activity會經常在暫停和恢復之間進行狀態轉換——例如當設備轉入休眠狀態或者有新的Activity啟動時,將調用onPause() 方法。當Activity獲得結果或者接收到新的Intent時會調用onResume() 方法。
 
 
說瞭一大堆的理論,下面一起動手來開發一個小實例,幫助大傢快速理解。不妨試著動手去敲代碼,然後自己監控控制臺上的日志記錄。
先貼出Activity部分的代碼:
最先是一個MainActivity,這個也是軟件啟動時默認打開的。

package cn.itcast.life; 
 
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 MainActivity extends Activity { 
    private static final String TAG = "MainActivity"; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        Log.i(TAG, "onCreate()"); 
         
        Button button = (Button) this.findViewById(R.id.button); 
        button.setOnClickListener(new View.OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
                Intent intent = new Intent(MainActivity.this, OtherActivity.class); 
                startActivity(intent); 
            } 
        }); 
         
        Button threebutton = (Button) this.findViewById(R.id.threebutton); 
        threebutton.setOnClickListener(new View.OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
                Intent intent = new Intent(MainActivity.this, ThreeActivity.class); 
                startActivity(intent); 
            } 
        }); 
    } 
 
    @Override 
    protected void onDestroy() { 
        Log.i(TAG, "onDestroy()"); 
        super.onDestroy(); 
    } 
 
    @Override 
    protected void onPause() { 
         Log.i(TAG, "onPause()"); 
        super.onPause(); 
    } 
 
    @Override 
    protected void onRestart() { 
         Log.i(TAG, "onRestart()"); 
        super.onRestart(); 
    } 
 
    @Override 
    protected void onResume() { 
         Log.i(TAG, "onResume()"); 
        super.onResume(); 
    } 
 
    @Override 
    protected void onStart() { 
         Log.i(TAG, "onStart()"); 
        super.onStart(); 
    } 
 
    @Override 
    protected void onStop() { 
         Log.i(TAG, "onStop()"); 
        super.onStop(); 
    } 
     

MainActivity所匹配的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" 
    > 
<TextView   
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="@string/hello" 
    /> 
     
    <Button   
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
         android:text="打開OtherActivity" 
        android:id="@+id/button" 
        /> 
         
     <Button   
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
         android:text="打開ThreeActivity" 
        android:id="@+id/threebutton" 
        /> 
</LinearLayout> 


下面將是一個新的Activity,為瞭驗證“onstop”方法,我們要用這個OtherActivity將前面的MainActivity覆蓋掉。

package cn.itcast.life; 
 
import android.app.Activity; 
import android.os.Bundle; 
 
public class OtherActivity extends Activity { 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        // TODO Auto-generated method stub 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.other); 
    } 
 

 

<?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"> 
   
  <TextView   
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="這是OtherActivity" 
    /> 
</LinearLayout> 

還有一個Activity,是用於測試onpause方法的。使用半透明或者提示框的形式,覆蓋掉前面的MainActivity

package cn.itcast.life; 
 
import android.app.Activity; 
import android.os.Bundle; 
 
public class ThreeActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        // TODO Auto-generated method stub 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.three); 
    } 

 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"> 
   
  <TextView   
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="第三個Activity" 
    /> 
</LinearLayout> 

下面是項目清單文件,註意使用android:theme="@android:style/Theme.Dialog"來設置activity 的樣式風格–彈出框

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="cn.itcast.life" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".MainActivity" 
                  android:label="@string/app_name"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
        <activity android:name=".OtherActivity" android:theme="@android:style/Theme.Dialog"/> 
        <activity android:name=".ThreeActivity"/> 
    </application> 
    <uses-sdk android:minSdkVersion="8" /> 
 
</manifest>  

在模擬器中部署該應用,觀察控制臺中的日志顯示,看這些生命周期的執行順序,拭目以待吧。。。。。。
參照那張圖片,“當系統內存不足…”的這種情況,我暫時就不去模擬操作瞭。
補充:
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命周期方法,它們不同於 onCreate()、onPause()等生命周期方法,它們並不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState()才會被調用。但是當用戶主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,用戶的行為決定瞭不需要保存Activity的狀態。通常onSaveInstanceState()隻適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。
提示:在小例子“Android音樂播放器”中,就使用到瞭該方法。典型的應用場景:比如用戶正在聽音樂,在這首歌的1:32秒鐘時候,突然來電話瞭(發生意外,音樂播放器的Activity會被電話的Activity覆蓋掉),此時音樂會暫停,用戶正常的接聽電話。等用戶接完電話後,音樂播放器會記住當時的記錄是1:32,可以自動去繼續播放..

摘自:編程世界一凡人

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *