標籤:
Activity是Android中最重要,最常見,也是最基本的組件,下面來詳細介紹下Activity。
介紹
一個Acitvity作為一個顯示在螢幕上的使用者互動介面,比如在電子郵件應用中比如:一個用來顯示收件列表的Activity,一個用來寫郵件的Activity,一個閱讀郵件內容的Activity,等等。Activity用來提供使用者體驗,許多不同體驗的Activity聚集在一起即可以形成一個Android應用程式的使用者體驗,每一Activity都是相互獨立的。應用除了可以訪問自己的Activity,也可以訪問其他APP的Acitivity(需要被APP允許)。
其次,Activity類間接或者直接的繼承了Content,ContextWrapper,ContextThemeWrapper等基類,所以Activity可以直接調用他們的方法。為了讓Service能夠響應使用者請求開發人員需要重寫HttpService的doRequest(...),doResponse(。。)方法,或者重寫Service(...),Activity與此類似,建立一個Activity也需要實現一個或多個方法,其中最常見的就是實現onCreate(Bundle status),該方法會在Activity建立時被回調,該方法調用Activity的setContentView(View view)方法來顯示要展示的View,為了管理應用程式中的各組件,調用Activity的findViewById(int id)方法來擷取程式介面中的組件。
Activity的生命週期
一個Activity的啟動順序:
onCreate()——>onStart()——>onResume()
當另一個Activity啟動時:
第一個Activity onPause()——>第二個Activity onCreate()——>onStart()——>onResume()
——>第一個Activity onStop()
當返回到第一個Activity時:
第二個Activity onPause() ——> 第一個Activity onRestart()——>onStart()——>onResume()
——>第二個Activity onStop()——>onDestroy()
一個Activity的銷毀順序:
(情況一)onPause()——><Process Killed>
(情況二)onPause()——>onStop()——><Process Killed>
(情況三)onPause()——>onStop()——>onDestroy()
每一個活動( Activity )都處於某一個狀態,對於開發人員來說,是無法控制其應用程式處於某一個狀態的,這些均由系統來完成。
但是當一個活動的狀態發生改變的時候,開發人員可以通過調用 onXX() 的方法擷取到相關的通知資訊。
在實現 Activity 類的時候,通過覆蓋( override )這些方法即可在你需要處理的時候來調用。
一、 onCreate :當活動第一次啟動的時候,觸發該方法,可以在此時完成活動的初始化工作。
onCreate 方法有一個參數,該參數可以為空白( null ),也可以是之前調用onSaveInstanceState ()方法儲存的狀態資訊。
二、 onStart :該方法的觸發表示所屬活動將被展現給使用者。
三、 onResume :當一個活動和使用者發生互動的時候,觸發該方法。
四、 onPause :當一個正在前台啟動並執行活動因為其他的活動需要前台運行而轉入後台啟動並執行時候,觸發該方法。這時候需要將活動的狀態持久化,比如正在編輯的資料庫記錄等。
五、 onStop :當一個活動不再需要展示給使用者的時候,觸發該方法。如果記憶體緊張,系統會直接結束這個活動,而不會觸發 onStop 方法。 所以儲存狀態資訊是應該在onPause時做,而不是onStop時做。活動如果沒有在前台運行,都將被停止或者Linux管理進程為了給新的活動預留足夠的儲存空間而隨時結束這些活動。因此對於開發人員來說,在設計應用程式的時候,必須時刻牢記這一原則。在一些情況下,onPause方法或許是活動觸發的最後的方法,因此開發人員需要在這個時候儲存需要儲存的資訊。
六、onRestart :當處於停止狀態的活動需要再次展現給使用者的時候,觸發該方法。
七、 onDestroy :當活動銷毀的時候,觸發該方法。和onStop 方法一樣,如果記憶體緊張,系統會直接結束這個活動而不會觸發該方法。
· onSaveInstanceState :系統調用該方法,允許活動儲存之前的狀態,比如說在一串字串中的游標所處的位置等。
通常情況下,開發人員不需要重寫覆蓋該方法,在預設的實現中,已經提供了自動儲存活動所涉及到的使用者介面組件的所有狀態資訊。
與Activity 生命週期相關的方法
在 android.app.Activity類中,Android 定義了一系列與生命週期相關的方法,在我們自己的 Activity 中,只是根據需要複寫需要的方法,Java 的多態性會保證我們自己的方法被虛擬機器調用,這一點與 J2ME 中的 MIDlet 類似。
public class OurActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
這些方法的說明如下:
protected void onCreate(Bundle savedInstanceState)一個 Activity 的執行個體被啟動時調用的第一個方法。一般情況下,我們都覆蓋該方法作為應用程式的一個進入點,在這裡做一些初始化資料、設定使用者介面等工作。大多數情況下,我們都要在這裡從 xml 中載入設計好的使用者介面。例如:
setContentView(R.layout.main);
當然,也可從 savedInstanceState中讀我們儲存到存放裝置中的資料,但是需要判斷 savedInstanceState是否為 null,因為 Activity 第一次啟動時並沒有資料被存貯在裝置中:
if(savedInstanceState!=null){ savedInstanceState.get("Key"); }
protected void onStart()該方法在 onCreate() 方法之後被調用,或者在 Activity 從 Stop 狀態轉換為 Active 狀態時被調用。
protected void onResume()在 Activity 從 Pause 狀態轉換到 Active 狀態時被調用。
protected void onPause()在 Activity 從 Active 狀態轉換到 Pause 狀態時被調用。
protected void onStop()在 Activity 從 Active 狀態轉換到 Stop 狀態時被調用。一般我們在這裡儲存 Activity 的狀態資訊。
protected void onDestroy()在 Active 被結束時調用,它是被結束時調用的最後一個方法,在這裡一般做些釋放資源,清理記憶體等工作。
Activity狀態轉化圖
如上所示,Android 程式員可以決定一個 Activity 的“生”,但不能決定它的“死”,也就時說程式員可以啟動一個 Activity,但是卻不能手動的“結束”一個 Activity。當你調用 Activity.finish()方法時,結果和使用者按下 BACK 鍵一樣:告訴 Activity Manager 該 Activity 執行個體完成了相應的工作,可以被“回收”[ 根據下文的意思,應該是調用finish方法時只能使Activity進入Stoped狀態 ]。隨後 Activity Manager 啟用處於棧第二層的 Activity 並重新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。例如:從 Activity1 中啟動了 Activity2,則當前處於棧頂端的是 Activity2,第二層是 Activity1,當我們調用 Activity2.finish()方法時,Activity Manager 重新啟用 Activity1 併入棧,Activity2 從 Active 狀態轉換 Stoped 狀態,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,Activity2 返回的資料通過 data參數返回給 Activity1。
建立一個Activity的流程
首先,建立Activit
y
一個Activity建立完成後,為了它可以訪問系統必須要聲明註冊它到應用的AndroidManifest.xml文件中:
重寫onCreate方法
onCreate(),當活動第一次啟動時,觸發該方法,可以在此時完成活動的初始化工作,此方法必須要重寫。系統調用此方法建立activity,實現該方法是你初始化你所建立Activity的重要步驟。其中最重要的就是調用 setContentView() 去定義你的要展現的使用者介面的布局。
淺談Android Activity