天天看點

Android應用開發(四):Activity的四大啟動模式

本文主要介紹activity的啟動模式,即"standard"(預設模式)、"singletop "、"singletask"、"singleinstance"四大啟動模式,在此之前簡單總結了一下android元件的相關知識。

對于android應用,其應用程式的程序運作方式為:每一個應用程式都運作在它自己的linux程序中,當應用程式中的任何代碼需要執行時,android将啟動程序;當它不在需要且系統資源被其他應用程式請求時,android将關閉程序。

同時,需要注意的是:android應用程式不像别的應用程式那樣有main函數入口點,它沒有單一的程式入口點,但是它必須要有四個元件中的一個或幾個:活動(activities)、服務(services)、廣播接收者(broadcast receivers)、内容提供者(content providers)。

 下面分别簡單地介紹一下四個元件的概念和作用:

(1)、活動(activities):一個活動表示一個可視化的使用者界面,關注一個使用者從事的事件。例如,一個活動可能表示一個使用者可選擇的菜單項清單,或者可能顯示照片連同它的标題。每個活動一起工作形成一個整體的使用者界面,但是每個活動是獨立于其他活動的。每一個都是作為activity基類的一個子類的實作。

(2)、服務(services)、一個服務沒有一個可視化使用者界面,而是在背景無期限地運作。例如一個服務可能是播放背景音樂而使用者做其他一些事情,或者它可能從網絡擷取資料,或計算一些東西并提供結果給需要的活動(activities)。每個服務都繼承自service基類。

(3)、廣播接收者(broadcast receivers):一個廣播接收者是這樣一個元件,它不做什麼事,僅是接受廣播公告并作出相應的反應。許多廣播源自于系統代碼,例如公告時區的改變、電池電量低、已采取圖檔、使用者改變了語言偏好。應用程式也可以發起廣播,例如為了其他程式知道某些資料已經下載下傳到裝置且他們可以使用這些資料。

一個應用程式可以有任意數量的廣播接收者去反應任何它認為重要的公告。所有的接受者繼承自broadcastreceiver基類。

(4)、内容提供者(content providers):内容提供者(content provider)使一個應用程式的指定資料集提供給其他應用程式。這些資料可以存儲在檔案系統中、在一個sqlite資料庫、或以任何其他合理的方式。内容提供者繼承自contentprovider 基類并實作了一個标準的方法集,使得其他應用程式可以檢索和存儲資料。然而,應用程式并不直接調用這些方法。相反,替代的是它們使用一個contentresolver對象并調用它的方法。contentresolver能與任何内容提供者通信,它與提供者合作來管理參與進來的程序間的通信。

有四種不同的啟動模式可以配置設定到<activity>元素的launchmody屬性: "standard"(預設模式)、"singletop "、"singletask"、"singleinstance"。

(1)、"standard"(預設模式)

假設目标task的activity棧為: a->b->c->d(棧底->棧頂),在程式中調用startactivity(d),如果d是standard模式, 則activity棧變為:a->b->c->d->d, 也就是會重新建立一個d執行個體。

(2)、"singletop "

假設目标task的activity棧為: a->b->c->d(棧底->棧頂),在程式中調用startactivity(d),如果d是singletop模式, 則activity棧變為:a->b->c->d,不會建立d執行個體,就是說如果d在目标task 的activity棧的棧頂,則不會建立新的執行個體,而是調用d的onnewintent()方法,反之如果d不在目标task 的activity棧的棧頂,則會重新建立一個d執行個體。

(3)、"singletask"

假設目标task的activity棧為: a->b->c->d(棧底->棧頂),如果a調用startactivity(b)啟動b執行個體,則a和b位于同一個task中。

(4)、"singleinstance"

假設目标task的activity棧為: a->b->c->d(棧底->棧頂),如果a調用startactivity(b)啟動b執行個體,則系統會自動給intent添加一個屬性flag_activity_new_task,将b執行個體放入到一個新的task中,也就是說a執行個體所在的task中隻能有a自己,不能存在其他執行個體。

程式設計設計兩個activity,一個是mainactivity,另一個是b activity,在兩個activity中都設定兩個按鈕,都實作點選傳回自身和另一個activity的功能。在androidmainfest.xml中配置launchmode即可實作四種不同的activity啟動模式。

(1)、按鈕設計

按鈕實作代碼如下:

(2)、實作兩個activity之間的切換功能

在mainactivity中的實作代碼如下:

在b activity中的實作代碼如下:

(3)、activity啟動模式切換方法

在androidmainfest.xml中配置launchmode即可實作四種不同的activity啟動模式。

更改的對應代碼如下:

可以配置為:standard(預設方式)/singletop/singletask/singleinstance四種方式之一。

第一個啟動的界面如下:

Android應用開發(四):Activity的四大啟動模式

點選“啟動mainactivity”,界面為:

Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式

點選“啟動b activity”,界面為:

Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式

測試結果為:任務id不變,但是每點選一次按鈕,執行個體的id發生一次變化;b activity的測試結果也一樣,即任務id不變,但是每點選一次按鈕,執行個體的id發生一次變化。

結果分析:預設情況下,在同一個任務棧中建立了不同的執行個體。

應用:可以實作activity任務之間的跳轉機制,原理就是任務棧是先進後出的。

Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式

測試結果為:點選mainactivity,沒有發生變化,說明沒有建立新的執行個體;點選b activity,執行個體id發生變化,說明b activity建立了新的執行個體。

結果分析:如果目前activity處于棧頂,隻能建立一個執行個體;如果目前activity不處于棧頂,可以建立新的執行個體。

Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式

點選傳回鍵,app退出。

測試結果為:點選mainactivity,沒有發生變化,說明沒有建立新的執行個體;點選b activity,執行個體id發生變化,說明b activity建立了新的執行個體,但是在b activity中點選mainactivity,會發現其執行個體id與剛開始的執行個體id一緻,再次點選傳回,app退出。

結果分析:singletask使得任務棧中隻能存在一個任務,若存在兩個activity,會将之前的activity自動彈出。

Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式
Android應用開發(四):Activity的四大啟動模式

測試結果為:不同的activity的任務id不同。

結果分析:一個任務棧中隻能有一個activity,兩個任務棧可以互相切換。

繼續閱讀