Activity為我們提供一個可進行交互的窗口。當activity類創建了一個窗口,開發人員可以通過setContentView(View)接口把UI放到activity創建的窗口上。
開發應用時我們需要繼承Activity或者是它的子類。
Activity的生命周期:
下圖已經清楚的展示出Activity的生命周期了,我們結合下圖再進行一些解釋。
全生命周期:onCreate()->onDestroy()
在onCreate()中初始化Activity所能使用的全局資源和狀態,在onDestroy()中釋放這些資源。
可視生命周期:onStart()->onStop()以及onRestart()
這個過程是界面從可見到不可見的過程,但並不是全程都是允許交互的。onStart()一般用於初始化或啟動與界面更新相關的資源,onStop()一般用於暫停和停止與更新界面相關的線程、計時器和服務。
活動生命周期:onResume()->onPause()
該過程中Activity在屏幕的最頂層,並且能夠與用戶發生交互。該周期的兩個函數會頻繁地被使用,所以這兩個方法中應該盡量是簡單、高效的代碼。
另外兩個方法:
onRestoreInstanceState()和onSaveInstanceState()
不屬於?命周期的事件回調函數,但可以?於保存和恢復Activity的界?臨時信息
onSaveInstanceState()會將界?臨時信息保存在Bundle中,onCreate()和onRestoreInstanceState()都可以恢復這些保存的信息。
簡化的辦法是使?onCreate() 恢復,但有些特殊的情況下還是需要使?onRestoreInstanceState()函數恢復 :
■ 必須在界?完全初始化完畢後才能進?的操作
■ 或需要由?類來確定是否采?缺省設置等
Activity的配置:
四大組件都是需要我們顯式配置的。Activity就在裡面加個。
我們著重講一下Activity配置時候常用的幾個屬性:
name:指定該Activity的實現類的類名。
icon:圖標。
label:標簽。
exported:是否允許被其他應用調用。
launchMode:啟動模式,可選項有standard、singleTop、singleTask、singleInstance。
下面著重說下
Activity的啟動模式(launchMode)。
以前總是以為Activity有一個Activity棧,Activity們就這樣FILO,原來是自己太na?ve。
standard:每次啟動Activity都會產生新的實例,並加到棧中。
singleTop:與standard類似,不同的是,當啟動的Activity剛好處於棧頂時,不產生新的實例,而是直接復用棧頂的這個實例。
singleTask:有與前面兩個相同的處理方式,不同的是,當要啟動的Activity不處於棧頂的時候但是處於棧中的時候,會移出這個Activity實例上面的所有實例,把需要啟動的Activity置於棧頂。
singleInstance:每次啟動新的Activity都會產生實例並放在一個新的棧中,每次啟動存在的Activity都會直接復用存在的實例。
Activity的跳轉:
啟動Activity的方法有:(先說顯式啟動,隱式啟動後面會介紹)
startActivity(Intent intent)和startActivityForResult(Intent intent,int requestCode)
第二個方法的第二個參數requestCode為請求碼,用於標識啟動請求的來源。
記得要在配置文件配置Intent,雖然大多數時候都不需要我們自己去做。
關閉Activity的方法:
finish()和finishActivity(int requestCode)
這兩個方法分別於前面兩個啟動方法相對應。
在關閉Activity的方法被調用前我們常常還會用到下面這個函數:
void setResult( int ResultCode, Intent data)
參數:
結果碼ResultCode:表明?Activity的返回狀態 ,通常為為Activity.RESULT_OK或 Activity.RESULT_CANCELED,也可以是自己定義的其他整型。
返回值data:?Activity需要返回的數據傳遞。
子Activity關閉時,我們可以在父Activity中通過重寫public void onActivityResult (int requestCode, int resultCode, Intent data)方法來接受子Activity的請求碼、返回狀態和數據。
Activity之間的數據傳遞:
Intent充當信使為我們傳遞數據,我們只需要把需要傳遞的數據放到Intent上就好了。Intent存取數據的方法:
putExtras(Bundle data)
Bundle getExtras()
putExtra(String key,Xxx value):其實會隱式地產生一個Bundle。
Xxx getXxxExtra(String key)
Bundle可以理解為一個數據包,用來裝各種各樣的數據,除了在這裡,我們在使用Message在同一個Activity的不同線程傳遞數據時,也會用到Bundle。
Bundle存取數據的方法:
putXxx(String key,Xxx data)
getXxx(String key)
putSerializable(String key,Serializable data) :Serializable指一個可序列化對象,比如一個類的實例。
getSerializable(String key)
隱式啟動Activity
應用場景比如你要打開一個文檔,但你的手機中有一個或者好幾個可以打開文檔的應用,這時系統會自動為你匹配可以打開文檔的應用,你選擇一個來打開文檔,就是隱式地啟動了一個Activity。
應用本身沒有指定啟用那個Activity,而是由系統來決定。這種做法很好的降低了組件之間的耦合度、提高了組件的可復用性。
系統會自動匹配合適的Activity,其中的匹配機制是依靠Android系統中的Intent過濾器(Intent Filter)來實現的。
這部分的內容較復雜,我們下一篇博客單獨來介紹。