前面我們做了一個小例子,在分析代碼的時候我們提到了Activity,那麼什麼是Activity呢?
Activity是Android應用程式提供互動界面的一個重要元件,也是Android重要元件之一(另外3個是Service、BroadcastReceiver和ContentProvider)。
與開發Web應用時建立Servlet類相似,建立自己的Activity也需要繼承Activity基類,當然,在不同應用場景下,有時也要求繼承Activity的子類。例如如果應用程式界面隻包括清單,則可以讓應用程式繼承ListActivity;如果應用程式界面需要實作标簽頁效果,則可以讓應用程式繼承TabActivity。
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的生命周期
歸納起來Activity大緻有如下4個狀态
1、活動狀态(runing) :目前activity處于前台,使用者可見,可以獲得焦點
2、暫停狀态(pause):其他activity位于前台,該activity依然可見,隻是不能獲得焦點
3、停止狀态(stop):該activity不可見,失去焦點
4、銷毀狀态(destory):該activity結束,或activity所在的Dalvik程序被結束
接下來再來看看配置Activity時候的android:launchMode屬性
當我們啟動一個應用的時候實際上Dalvik虛拟器會建立一個Task,而每個程序都有一個id,虛拟機是以棧的形式來管理每個Task的,先啟動的activity放在Task棧底,後啟動的activity放在Task棧頂。
Activity的加載模式,就負責管理執行個體化、加載activity的方式(也就是上面的android:launchMode設定)
1、standard模式
每次通過這種模式啟動activity時,android總會為目标activity建立一個新的執行個體,并将該activity添加到棧中。
這種模式不會産生新的Task,新activity将被添加到原有的Task中。
例如:
不斷的按上面的按鈕,控制台列印結果如下:
這證明了每次都調用了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)現在應該明白了吧。
總結起來有兩點:
1、Activity構造的時候調用了attach綁定了一個窗體
2、Activity在setContentView的時候實際上是它所綁定的窗體設定contentView