天天看點

Android菜鳥的成長筆記(7)——什麼是Activity

前面我們做了一個小例子,在分析代碼的時候我們提到了Activity,那麼什麼是Activity呢?

Activity是Android應用程式提供互動界面的一個重要元件,也是Android重要元件之一(另外3個是Service、BroadcastReceiver和ContentProvider)。

與開發Web應用時建立Servlet類相似,建立自己的Activity也需要繼承Activity基類,當然,在不同應用場景下,有時也要求繼承Activity的子類。例如如果應用程式界面隻包括清單,則可以讓應用程式繼承ListActivity;如果應用程式界面需要實作标簽頁效果,則可以讓應用程式繼承TabActivity。

Android菜鳥的成長筆記(7)——什麼是Activity

Activity的啟動過程

1、建立activity類及定義屬性和内部方法

2、注冊activity在manifest檔案中

3、在啟動函數onCreate中實作業務

3.1 界面定義layout 3.2界面的綁定setContentView()

這是我們前面的Activity,下面我們來實作一個LauncherActivity

LauncherActivity繼承了ListActivty,是以它本質上也是一個開發清單界面的Activity,但它開發出來的清單界面與普通清單界面有所不同。它開發出來的清單界面中的每個清單項都對應一個Intent,是以當使用者單擊不同的清單項時,應用程式會自動啟動對應的Activity。

一個Android應用通常包含多個Activity,但是隻有一個Activity會作為程式的入口,如上面的MainActivity

Activity啟動其他Activity有兩個方法

startActivity(Intent intent) :啟動其他Activity

startActivityForResult(Intent intent, int requestCode) :以指定的請求碼啟動Activity,而且程式将會等到新啟動Activity的結果(通過重寫onActivityResult方法擷取)

Android為關閉Activity提供了如下兩個方法

finish() :結束目前Activity

finishActivity(int requestCode) :結束以startActivityForResult(Intent intent, int requestCode)方法啟動的Activity

下面我們來看看Activity的生命周期

Android菜鳥的成長筆記(7)——什麼是Activity

歸納起來Activity大緻有如下4個狀态

1、活動狀态(runing) :目前activity處于前台,使用者可見,可以獲得焦點

2、暫停狀态(pause):其他activity位于前台,該activity依然可見,隻是不能獲得焦點

3、停止狀态(stop):該activity不可見,失去焦點

4、銷毀狀态(destory):該activity結束,或activity所在的Dalvik程序被結束

接下來再來看看配置Activity時候的android:launchMode屬性

Android菜鳥的成長筆記(7)——什麼是Activity

當我們啟動一個應用的時候實際上Dalvik虛拟器會建立一個Task,而每個程序都有一個id,虛拟機是以棧的形式來管理每個Task的,先啟動的activity放在Task棧底,後啟動的activity放在Task棧頂。

Activity的加載模式,就負責管理執行個體化、加載activity的方式(也就是上面的android:launchMode設定)

1、standard模式

每次通過這種模式啟動activity時,android總會為目标activity建立一個新的執行個體,并将該activity添加到棧中。

這種模式不會産生新的Task,新activity将被添加到原有的Task中。

例如:

不斷的按上面的按鈕,控制台列印結果如下:

Android菜鳥的成長筆記(7)——什麼是Activity

這證明了每次都調用了onCreate方法,但是Task是同一個。

2、singleTop模式

與standard模式不同的是當将要被啟動的目标Activity已經位于Task棧頂時,系統不會重新建立activity執行個體。

如果将上面代碼中的Activity的啟動模式改為singleTop,點選多次,都不會再次調用onCreate方法。

3、singleTask模式

采用這種模式的Activity在同一個Task内隻有一個執行個體。分為如下三種情況:

(1)如果将要啟動的目标Activity不存在,體統會建立目标activity的執行個體,并将它加入Task棧頂

(2)如果将要啟動的目标activity已經位于Task棧頂,此時與singleTop模式的行為相同

(3)如果将要啟動的目标activity已經存在、但是沒有位于Task棧頂,系統将會把位于該activity上面的所有activity移出Task棧,進而使目标activity轉入棧頂

4、singleInstance模式

這種模式下,系統會保證無論哪個Task中啟動目标activity,隻會建立一個目标activity執行個體,并會使用一個全新的Task棧來裝載activity執行個體。

接下來我們進入Android系統源代碼看看Activity裝載界面的過程

打開Activity.java的源碼會看到setContentView方法實際上調用的是Window對象的setContentView方法,其實Window是一個抽象類,真正是通過PhoneWindow來實作的

如果根視圖為null則建立一個window否則之間加載視圖檔案,這樣我們就明白了,其實視圖是加載到Window對象上的,接下來我們再來看一下如何将Activity和Window聯系起來,其實在啟動activity的時候會調用一個attach方法

看到代碼中有mWindow = PolicyManager.makeNewWindow(this)現在應該明白了吧。

Android菜鳥的成長筆記(7)——什麼是Activity

總結起來有兩點:

1、Activity構造的時候調用了attach綁定了一個窗體

2、Activity在setContentView的時候實際上是它所綁定的窗體設定contentView

繼續閱讀