一個應用往往包含很多 activities .每個 activity 都 應圍繞著用戶可執行的特定動作來設計,并且可以啟動其它 activitie .例如,一個 email 應用可能可能有一個顯示新郵件列表的 activity .當用戶選擇一個郵件,一個新的 activity 被打開以顯示郵件內容.
一個 activity 也可以打開同一設備上存在于其它應用的 activitie ,例如, 如果你的應用想要發送一個郵件,你可以定義一個 intent 來執行一個 "send" 動作并包含一些數據,比如一個地址和一條信息.另一個應用中的一個叫囂自己可以處理這種 intent 的 activity 就被打開 ( 如果有多個 activitie 支持同樣的 intent ,那么系統會讓用戶選擇一個 ) .當 email 被發送后,你的 activity 被恢復并且看起來發送郵件的 activity 好 像是你的應用的一部分.即使那個 activitie 可能來自不同的應用, Android 也 靠著把兩個 activity 保存在同一個任務中來實現這種無縫的用戶體驗.
一個任務是用戶在執行某種工作時所交互的 activitie 的集合. activitie 們 放置 在一個棧 (" 后退棧 ") 中,按照打開的順序排列.
設備的 Home 屏是大多數任務的開始場所.當用戶觸摸在應用啟動臺中的圖標 ( 或一個 home 屏上的快捷方式 ) 時,應用的任務就來到了前臺.如果沒有這個應用的已存在的任務 ( 這個應用最近沒有被使用 ) ,那么一個新的任務被創建并且這個應用的 "main"activity 被作為棧的根 activity 打開.
當當前的 activity 啟動了另一個 activity ,新的 activity 被放置在棧頂并擁有焦點.先前的 activity 依然保存在棧中,但是停止了.當一個 activity 停止時,系統保存了它的用戶界的當前狀態.當用戶后退按鈕時,當前的 activity 被從棧頂彈出 (activity 被銷毀了 ) 并且先前的 activity 被恢復了.棧中的 Activities 永不會被重新排列,只是入棧或出棧 — 當被當前 activity 啟動時就入棧,當用戶使用后退按鈕離開它時就出棧.如此,后退棧也是一個后進先出的棧.
下圖展示了工作棧的變化過程.
如果用戶繼續后退,那么棧中的各 activity 被彈出來展示上一個,直到用戶退到 Home 屏 ( 或到達任務開始時運行的那個 activity) .當所有的 activitie 都從棧種移除,任務就不再存在.
一個任務是一個有聚合力的單元,它可以在用戶啟動一個新的任務或回到 home 屏時被整體地移到后臺.當位于后臺時,任務中的所有的 activitie 都處于停止,但是任務的后退棧卻保存完整—當任務被另一個任務取代時,僅僅是失去了焦點.見圖2:
圖 2. 兩個任務:任務 B 到了前臺,任務 A 于是被打入后臺,伺機恢復.
一個任務可以再回到前臺,于是用戶可以獲得他離開時的模樣.舉個例子,當前的任務 ( 任務 A) 有三個 activitie 在其棧中—兩個在下面.用戶按下 Home 按鈕,然后又啟動一個新的應用.當 Home 屏出現時,任務 A 到了后臺.當新應用啟動時,系統為這個應用開始了一個任務 ( 任務 B) .當使用完新應用時,用戶再次回到了 Home 屏然后選擇了啟動任務A的那個應用.現在,任務 A 來到了前臺—其棧中所有的三個 activitie 都完整保留并且位于頂層的 activity 被恢復.此時,用戶也可以再回到 home 屏然后選擇任務B的應用于是回到任務B ( 或通過長按 Home 按鈕以顯示最近的任務然后選擇它 ) .
注: 多個任務可以同時存在于后臺.然而,如果用戶在同一時刻運行多個后臺任務,系統可能會銷毀后臺 activitie 來釋放內存,從而導致 activity 狀態的丟失.
因為后退棧中的 activitie 從不會被重排,如果你的應用允許用戶從不只一個 activity 啟動一個特殊的 activity ,一個新的 activity 的實例會被創建并壓入棧中 ( 而不是把這個 activity 的當前實例弄到前臺來 ) .所以,你的應用中的一個 activity 可能被多次實例化 ( 甚至是從不同的任務 ) ,如圖 3 所示 . 同樣的,如果用戶使用后退按鈕向后導航, activity 的每個實例都會按照打開的順序重新顯現 ( 每個都保持它們自己的狀態 ) .然后,你如果不想某個 activity 被實例化多次,你可以改變這種行為.后面會講到如何做.
圖 3 .一個 activity 被實例化多次.
下面總結一下下 activity 和任務的默認行為:
-
當 ActivityA 啟動 ActivityB , ActivityA 停止,但是系統保存它的狀態 ( 比如滾動條的位置和表單中輸入的文本 ) .如果用戶在 Activity B 中按下了后退按鈕, ActivityA 以保 存的狀態恢復.
-
當用戶按下 Home 按鈕離開了一個任務,當前的 activity 停止同時它的任務進入后臺.系統保持任務中每個 activity 的狀態.如果用戶后來運行了這個任務的應用而恢復了這個任務,任務回到前臺并使棧頂端的 activity 恢復.
-
如果用戶按下了后退按鈕,當前的 activity 從棧中彈出并被銷毀.前一個 activity 被恢復.當一個 activity 被銷毀時,系統不再保持 activity 的狀態.
-
Activitie 可以被多次實例化,即使是從另外的任務.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
