學習 活動與任務

2022-03-19 03:08:07 字數 4545 閱讀 9081

引言

關於android應用程式原理及術語,前面兩篇:

介紹了android應用程式的程序執行方式:每乙個應用程式執行在它自己的linux程序中。當應用程式中的任何**需要執行時,android將啟動進

程;當它不在需要且系統資源被其他應用程式請求時,android將關閉程序。而且我們還知道了android應用程式不像別的應用程式那樣(有main

函式入口點),它沒有單一的程式入口點,但是它必須要有四個元件中的乙個或幾個:活動(activities) 、服務(services)

、廣播接收者(broadcast receivers) 、內容提供者(content

providers)。且分別介紹它們的作用,及如何啟用和關閉它們、如何在清單檔案(androidmanifest.xml)中宣告它們及

intent過濾器。

在簡單回顧之後,本篇還是繼續介紹android應用程式原理及術語——活動與任務(activities and tasks)。

1、活動與任務概述

如前所述,乙個活動(activity)能啟動另乙個活動,包括定義在別的應用程式中的活動。再次舉例說明,假設你想讓使用者顯示某地的街道地圖。而且已經有了乙個活動能做這個事情(假設這個活動叫做地圖檢視器),因此你的活動要做的就是將請求資訊放進乙個intent物件,然後將它傳給startactivity()。地圖檢視器就啟動並顯示出地圖。當使用者點選返回按鈕之後,你的活動就會重新出現在螢幕上。

對使用者來說,這個地圖檢視器就好像是你的應用程式的活動一樣,雖然它定義在其他的應用程式中且執行在那個應用程式的程序中。android將這些活動保持在同乙個任務(task)中以維持使用者的體驗。簡單地講,任務是使用者體驗上的乙個「應用程式」,是排成堆疊的一組相關活動

棧底的活動(根活動)是起始活動——一般來講,它是使用者在應用程式啟動器(也稱應用程式列表,下同)中選擇的乙個活動。棧頂的活動是正在執行的活動——它

關注使用者的行為(操作)。當乙個活動啟動另乙個,新的活動被壓入棧頂,變為正在執行的活動。前面那個活動儲存在棧中。當使用者點選返回按鈕時,當前活動從棧

頂中彈出,且前面那個活動恢復成為正在執行的活動。(關於棧的先進後出特性不要我在這裡講吧!)

棧中包含物件,因此如果乙個活動(再次說明:活動是activity的子類

啟動了多個例項——例如多個地圖檢視器,則棧對每個例項有乙個獨立的入口。(可以這樣理解:假設有四個活動以這樣的順序排在棧中——a-b-c-d,現在

又有乙個c的例項,則棧變成a-b-c-d-c,這兩個c的例項是獨立的。)棧中的活動從不會被重新排列,只會被壓入、彈出。這點很好理解,因為活動的調

用順序是固定的。

任務是一棧的活動,而不是清單檔案中宣告的某個類或元素,因此無法獨立於它的活動為任務賦值。整個任務的值是在棧底活動(根活動)設定的。例如,下節將討論的「任務親和度」,親和度資訊就是從任務的根活動中獲取的。

乙個任務的所有活動作為乙個整體執行。整個任務(整個活動棧)可置於前台或傳送到後台。例如,假設當前任務有四個活動在棧中——三個活動在當前活動下面。用

戶按下home鍵,切換到程式啟動器,並選擇乙個新的應用程式(實際上是乙個新的任務)。當前任務進入後台,新任務的根活動將顯示。接著,過了一會,使用者

回到主螢幕並再次選擇之前的應用程式(之前的任務)。那個任務棧中的所有四個活動都變為前台執行。當使用者按下返回鍵時,不是離開當前任務回到之前任務的根

活動。相反,棧頂的活動被移除且棧中的下乙個活動將顯示。

上面所描述的是活動和任務的預設行為,但是有方法來改變所有這些行為。活動與任務之間的聯絡及任務中活動的行為,是由啟動活動的intent物件的標誌(flags)和清單檔案中活動元素的屬性共同決定的。

在這方面,主要的intent標誌有:

主要的屬性有:

接下來的小節將討論這些標誌和屬性的作用,他們怎麼互動,及使用的注意事項。

2、親和度和新任務(affinities and new tasks)

預設情況下,乙個應用程式的所有活動互相之間都有乙個親和度(affinity)——也就是說,他們屬於同乙個任務的偏好(preference)。然而,也可以通過元素的taskaffinity屬性為每個活動設定個體親和度。定義在不同應用程式中的活動能夠共享親和度,同乙個應用程式中的活動可以分配不一樣的親和度。親和度發揮作用的兩種情況:1)啟動活動的intent物件包含flag_activity_new_task標誌時;2)乙個活動的allowtaskreparenting屬性為"true"時。

如前所述,預設情況下,乙個新的活動被啟動到呼叫startactivity()方法的活動所在的任務。它被壓入呼叫它的活動的棧中。但是,如果傳遞給方法的intent物件包含flag_activity_new_task標誌,系統找乙個不同的任務容納活動。通常,顧名思義它表示乙個新任務。但是,他並非一定如此。如果已經存在乙個任務與新活動親和度一樣,該活動將啟動到該任務。如果不是,則啟動乙個新任務。

如果乙個活動的allowtaskreparenting屬性為"true",

它可以從啟動它的任務轉移到與它有親和度並轉到前台執行的任務中。例如,假設乙個天氣預報的活動,但選擇城市是乙個旅遊應用程式的一部分。它與同乙個應用

程式中的其他活動具有相同的親和度,且允許重新選擇父活動(reparenting)。你的乙個活動啟動天氣預報活動,因此他初始是跟你的活動屬於同乙個

任務。但是,當旅遊應用程式切換到前台執行時,天氣預報活動將被重新分配和顯示到該任務。

如果乙個.apk檔案,從使用者的角度看包含不止乙個「應用程式」,你可能要為與他們有關的些活動指定不一樣的親和度。

3、啟動模式(launch modes)

有四種不同的啟動模式可以分配到元素的launchmody屬性:

這些模式的在以下四方面不同:

當乙個已存在的活動被請求處理乙個新的意圖,intent物件將通過onnewintent()呼叫傳到活動。(產生啟動活動的意圖物件可以由getintent()獲取。)

注意到當乙個活動的新例項被建立去處理新意圖時,使用者總是可以按返回鍵返回到之前的狀態(之前的活動)。但是當乙個已存在的活動例項去處理新意圖是,使用者不可以按返回鍵返回到意圖到達之前的狀態。

4、清除棧(clearing the stack)

如果使用者離開乙個任務很長時間,系統將會清除根活動之外的活動。當使用者再次返回到這個任務時,像使用者離開時一樣,僅顯示初始的活動。這個想法是,一段時間後,使用者可能已經放棄之前做的東西,及返回任務做新的事情。這是預設情況,有些活動屬性可以用來控制和改變這個行為。

有其他的方法強制從棧中移除活動。如果intent物件包含flag_activity_clear_top標誌,目標任務已經有乙個指定型別的活動例項,棧中該例項上面的其它活動將被移除而使它置於棧頂響應意圖。如果指定的活動的啟動型別是"standard",它自己也將被移除出棧,且乙個新的例項將被啟動去處理到來的意圖。這是因為當模式是"standard"時,總是建立乙個新的例項去處理新的意圖。

flag_activity_clear_top標誌經常與flag_activity_new_task一起使用。當一起使用時,這些標誌的方式是定位到另乙個任務中的已存在的活動並把它放到可以處理意圖的位置。

5、啟動任務(starting tasks)

通過給定活動乙個意圖過濾器"android.intent.action.main"作為指定行為(action)和"android.intent.category.launcher"指定種類(category),活動就被設定為任務的入口點了。上篇android開發之旅:應用程式基礎及元件(續)第四節intent過濾器中我們舉了這樣乙個例子,它將導致該活動的圖示(icon)和標籤(label)顯示在應用程式啟動器,給使用者啟動它或啟動之後任意時候返回到它。

它的第二個功能非常重要:使用者可以離開任務且之後可以返回到它。基於這個原因,兩個啟動模式"singletask"和"singleinstance"標記活動總是初始化乙個任務來響應意圖,僅可以使用在有main和launcher過濾器的活動中。想象一下,如果沒有這個過濾器將會發生什麼:乙個意圖啟動乙個"singletask"活動,開始乙個新任務,使用者在任務中做一些操作。然後使用者按下home鍵,任務現在退到後台執行且被主螢幕遮蔽住。而且,由於活動不在應用程式啟動器中顯示,使用者無法再返回。

類似的困難也出現在flag_activity_new_task標誌。如果這個標誌導致乙個活動開始乙個新的任務且使用者按home鍵離開它,就必須要有某種方法是使用者能夠導航回來。一些實體(如通知管理器)總是在外部任務啟動活動,從不作為他們自己的一部分,因此他們總是將帶flag_activity_new_task

如果您希望使用者離開活動後就不能再回到這個活動,可以將元素的finishontasklaunch屬性設定為"true"。可以參見清除棧那節。

軟體生存週期的過程,活動和任務

定義,分析需求或委託供方進行需求分析而後認可 招標準備 合同準備以及驗收 評審需求 準備投標 簽訂合同 制訂並實施專案計畫 開展評審及評價 交付產品 過程實施 系統需求分析 系統結構設計 軟體需求分析 軟體結構設計 軟體詳細設計 軟體編碼和測試 軟體整合 軟體合格測試 系統整合 系統合格測試 軟體安...

巨集任務與微任務

之前我們討論過js 執行的同步和非同步,js的單執行緒執行機制不會改變 但是僅僅懂得同步非同步是遠遠不夠的 比如說下面這些 1 settimeout function 4new promise function resolve,reject then function 10 console.log ...

巨集任務與微任務

js是單執行緒,所以也可以說是主線程,所以js 都是在主線程執行的,只不過我們要區分它是同步執行還是非同步執行 當乙個 是非同步的話,對應的是 函式。不同的任務對應不同的 比如 定時器的 傳送js的 對應事件的 定時器模組,網路請求模組,事件處理模組,的執行取決於模組什麼時候將 函式放入到事件佇列e...