Task
在android中,task的定義是,多個activity協同工作來完成某一項應用的過程。注意,這裡的activity並不要求屬於同一個application。如所示,我們的task所需要的activity可能來自多個application。
activity可以看做是獨立存在於系統中,並且作為現實具體應用的主體,task將一些activity關聯起來以便實現一個更複雜的功能,一個或者多個task又可以組成一個application。這就是三者之間的關係。簡單點說,就是一個application包含一個或多個task,而一個task又包含一個或者多個activity。
下面說一下activity和task的基本原理:
絕大多數的application都是通過home screen的捷徑啟動的,(另一種啟動方式是通過系統的application launcher啟動)。啟動某個application之後,該application的根activity將會顯示在當前視窗,首頁activity將會隱藏到後台。
當我們在home頁中點擊email表徵圖的時候,應用中的list message activity將會顯示在當前視窗,而home activity則隱藏到了後台。按back鍵我們便可以重新返回到home頁面。
這裡要注意,應用back鍵和home鍵退出是有本質上區別的:兩者雖然都可以離開當前activity,但是back會銷毀當前activity的狀態,home則會儲存當前activity的狀態。
關於back:
將會終止當前的activity,返回到之前的activity(如果當前的activity已經是根activity,那麼就直接返回到home screen),在這個過程中,系統會銷毀當前activity的狀態資訊,當我們再次回到這個activity時,展示給我們的將會是一個全新的activity。
我們可以看到當我們在list messages這個activity中點擊back按鈕時,我們的list messages activity將會被銷毀掉。
關於home:
我們可以看到,當我們通過home鍵返回home screen時,list message activity並沒有被銷毀,而是被調到了後台。這就意味著,當我們再次跳轉到該activity時,看到的還是原來的activity。
當然,上面說的只是大部分的情況,世界上哪裡都存在著特例,android當然也不會例外。
某些Activity從Background被“召喚”到foreground之後依然是相當於重新建立了新執行個體,其有區別於前邊所論述的結果。即便是暫時儲存在Background模式下(沒有被Destroied),其State資料也將丟失。例如:Contacts 和 Gallery 等。當使用者啟動了Contact應用程式,並點選某個條目查看詳細資料,如果通過Home鍵返回後,再次重複啟動Contact應用程式時,看到的並不是之前所開啟的特定條目的詳細資料,而是初始的預設介面。這個例子說明不是所有情況下通過Home鍵返回後都可以儲存當前Activity的State資訊。
另外一種是與Back鍵有關的特殊情況。前邊提及到大部分的Activity通過Back鍵返回到Home Activity時,其自身將被徹底銷毀,預設情況下Activity響應Back按鍵的方法被定義了Destroy行為。但對於某些特別情況,開發人員可以根據需求將相應Back按鍵事件的行為重新“override”,撤消預設的Destroy行為。音樂播放器是與其相關的一個典型應用,當使用者在播放器的Root Activity中觸發Back按鍵後,轉為Background模式下繼續播放當前的音樂,同時Home Activity轉為Foreground。
綜上所述,就一句話,對於開發人員的我們來說,開發過程中,我們是可以通過某些參數的設定來指定當使用者點擊back或者home時,到底銷毀還是不銷毀當前的activity。後邊的文章中,我們將會詳細的討論。
Activity的重用:
在多個application中,我們可以都需要用到同一個activity,這時候,就牽扯到了一個有關複用的問題。
舉例說明:Contacts(電話簿)應用Gallery(畫廊)擷取映像資源。
眾所周知Contacts是手機中最常執行的 App程式,主要用於儲存目前使用者的連絡人資訊,其中需要包含連絡人的頭像資訊。在Android平台中的映像資訊是由Gallery管理,所以Contacts必然需要複用Gallery Activity來擷取相應的映像資訊。
針對於Android或者其它平台開發應用程式都需要有良好的複用性意識,這個需要貫穿於項目的整個開發過程。包括如何利用當前系統的現有資源,或者考慮到將來可能會被其它應用程式用於完成特定的需求。當使用者正在調用的Intent filter不唯一時(IntentFilter不唯一說明當前activity被多個地方使用了),系統將彈出一個供使用者選擇的對話方塊,這的確是一個完美的解決方案。
,當我們在home screen中點擊電話簿時,會進入list contacts activity,然後我們選擇查看某個人的電話資訊,這時候我們會跳轉到view Contact activity,然後我們點擊編輯資訊,又跳轉到了edit Contact activity。當我們在編輯頁面中選擇添加圖片的時候,便會調用Gallery應用中的list pictures activity,將手機中儲存的圖片展示給使用者,使用者選定一張圖片,然後跳轉到crop picture activity對圖片的大小進行剪輯……。
Activity可以共用的依據是,具有相同IntentFilter的activity是可以相互替換的。往往系統在遇見多個這種情況時,會給使用者彈出一個挑選清單,讓使用者進行選擇,使用者選擇的activity將會被載入當前線程替代原有的預設activity。
多個任務同時運行舉例:
:
我們可以看到,在statue1時,使用者通過在home screen點擊map應用的捷徑啟動了view map activity;然後使用者點擊home鍵,跳轉到state2,在state2中我們可以看到view map activity被調到了後台,當前視窗顯示的是home screen;這時使用者在home screen點擊mcalendar應用的捷徑啟動了day view activity進入state3;然後我們再次返回home screen,通過點擊map應用的表徵圖重新進入view map activity,我們可以看到當前的map和我們剛才通過home鍵離開時的map一摸一樣。這就是一個典型的多個任務同時啟動並執行例子,當我們運行一個應用的時候,另一個應用並沒有被destroyed,而是被轉移到了後台,等待再次接受調用,顯示到當前視窗。
啟動application的兩種不同方式:
每個App都需要提供至少一個Entry point(進入點)供使用者或者系統調用其所關聯的Activities,Application launcher中的小表徵圖就是每個單獨App的Entry Point。另外App也可以相互間通過Activity作為Entry Point來啟動,可以將App所包含的每個Activity看作為潛在的Entry point。
例如中的打電話應用,我們一種方法可以通過打電話的程式直接撥號;另一種是先去電話簿中找到一個電話號碼,然後通過電話簿的activity進行關聯,調用撥號程式。
Intent解析
Intent代表意圖,這個意圖的解釋有很多,我這裡說一下我個人的理解。
記得上高中的時候,一節課要上好長時間的,時不時的就會口渴,結果非常悲劇的是我沒有帶水,於是便想問朋友借瓶水喝。可是兩個人離得比較遠,又是上課時間,我又不能弄成很大的動靜,於是我就寫了紙條扔給了我朋友,然後我很滿足的喝上了水。
在這個例子中,我想喝水是我的一個想法,而我朋友則能給我提供水。但是光有想法和水也不行啊,我得讓我朋友知道我想喝水啊。這時候,紙條便起到了一個關鍵的作用,它記載著我想做的事情,記載著我的意圖。所以說,這裡記載著我的想法的紙條就是一個意圖。
(我們都知道意圖在我們平時的理解中代表著想法,是一種虛無縹緲的東西,怎麼就和紙條這種實體的東西等價了呢。這裡可以這麼認為,Intent可以認為是意圖的載體。)
Intent對象包含兩個元素:
1)Action :例如 查看、編輯、撥打到電話、查看映像資源等等(紙上寫的“我想喝水”)。
2)Data:提供給某種行為的具體資料(紙上寫的資訊來源等資訊,比如chenzheng_java)。