Android應用程式模組詳解

來源:互聯網
上載者:User

在大多數作業系統裡,存在獨立的一個1對1的可執行檔(如Windows裡的exe檔案), 它可以產生進程,並能和介面表徵圖、應用進行使用者互動。但在Android裡,這是不固定的,理解將這些分散的部分如何進行組合是非常重要的。

由於Android這種可靈活變通的,在實現一個應用不同部分時你需要理解一些基礎技術:

一個android 包 (簡稱 .apk ) ,裡麵包含應用程式的代碼以及資源。這是一個應用發布,使用者能下載並安裝他們裝置上的檔案。

一個任務 ,通常使用者能當它為一個“應用程式”來啟動:通常在案頭上會有一個表徵圖可以來啟動任務,這是一個上層的應用,可以將你的任務切換到前台來。

一個進程 是一個底層的代碼運行層級的核心進程。通常.apk包裡所有代碼運行在一個進程裡,一個進程對於一個.apk包;然而, 進程 標籤常用來改變代碼啟動並執行位置,可以是 全部的.apk包 或者是獨立的 活動, 接收器, 服務, 或者 提供器組件。

任務

記住關鍵的一點:當使用者看到的“應用”,無論實際是如何處理的,它都是一個任務。如果你僅僅通過一些活動來建立一個.apk包,其中有一個肯定是上層入口(通過動作的intent-filter 以及分類android.intent.category.LAUNCHER),然後你的.apk包就建立了一個單獨任務,無論你啟動哪個活動都會是這個任務的一部分。

一個任務,從使用者的觀點,他是一個應用程式;對開發人員來講,它是貫穿活動著任務的一個或者多個視圖,或者一個活動棧。當設定Intent.FLAG_ACTIVITY_NEW_TASK標誌啟動一個活動意圖時,任務就被建立了;這個意圖被用作任務的根用途,定義區分哪個任務。如果活動啟動時沒有這個標記將被運行在同一個任務裡(除非你的活動以特殊模式被啟動,這個後面會討論)。如果你使用 FLAG_ACTIVITY_NEW_TASK標記並且這個意圖的任務已經啟動,任務將被切換到前台而不是重新載入。

FLAG_ACTIVITY_NEW_TASK必須小心使用:在使用者看來,一個新的應用程式由此啟動。如果這不是你期望的,你想要建立一個新的任務。另外,如果使用者需要從案頭退出到他原來的地方然後使用同樣的意圖開啟一個新的任務,你需要使用新的任務標記。否則,如果使用者在你剛啟動的任務裡按案頭(HOME)鍵,而不是退出(BACK)鍵,你的任務以及任務的活動將被放在傳統型程式的後面,沒有辦法再切換過去。

任務親和力(Affinities)

一些情況下Android需要知道哪個任務的活動附屬於一個特殊的任務,即使該任務還沒有被啟動。這通過任務親和力來完成,它為任務中一個或多個可能要啟動並執行活動提供一個獨一無二的靜態名字。預設為活動命名的任務親和力的名字,就是實現該活動.apk包的名字。這提供一種通用的特性,對使用者來說,所有在.apk包裡的活動都是單一應用的一部分。

當不帶 Intent.FLAG_ACTIVITY_NEW_TASK 標記啟動一個新的活動,任務親和力對新啟動的活動將沒有影響作用:它將一直運行在它啟動的那個任務裡。然而,如果使用NEW_TASK標記,親和力會檢測已經存在的任務是否具有相同的親和力。如果是,該任務會被切換到前台,新的活動會在任務的最上面被啟動。

你可以在你的表現檔案裡的應用程式標籤裡為.apk包裡所有的活動設定你自己的任務親和力,當然也可以為單獨的活動設定標籤。這裡有些例子示範如何使用:

如果你的.apk包裡包含多個使用者可開機上層應用程式,那麼你可能想要為每個活動分配不同的親和力。這裡有一個不錯的協定,你可以將不同的名字字串加上冒號附加在.apk包名字的後面 。 例如,"com.android.contacts"的親和力命名可以是"com.android.contacts:Dialer" and "com.android.contacts:ContactsList"。

如果你想替換一個通知,快速鍵,或者其它能從外部啟動的應用程式的內部活動,你需要在你想替換的活動裡明確的設定任務親和力(taskAffinity)。例如,如果你想替換連絡人詳細資料瀏覽介面(使用者可以直接操作或者通過捷徑調用),你需要設定任務親和力(taskAffinity)為“com.android.contacts”。

啟動模式以及啟動標記

你控制活動和任務通訊的最主要的方法是通過設定啟動模式的屬性以及意圖相應的標記。這兩個參數能以不同的組合來共同控制活動的啟動結果,這在相應的文檔裡有描述。這裡我們只描述一些通用的用法以及幾種不同的組合方式。

你最通常使用的模式是singleTop(除了預設為standard模式)。這不會對任務產生什麼影響;僅僅是防止在棧頂多次啟動同一個活動。

singleTask模式對任務有一些影響:它能使得活動總是在新的任務裡被開啟(或者將已經開啟的任務切換到前台來)。使用這個模式需要加倍小心該進程是如何和系統其他部分互動的,它可能影響所有的活動。這個模式最好被用於應用程式入口活動的標記中。(支援MAIN活動和LAUNCHER分類)。

singleInstance啟動模式更加特殊,該模式只能當整個應用只有一個活動時使用。

有一種情況你會經常遇到,其它實體(如搜尋管理器SearchManager 或者 通知管理器NotificationManager)會啟動你的活動。這種情況下,你需要使用 Intent.FLAG_ACTIVITY_NEW_TASK 標記,因為活動在任務(這個應用/任務還沒有被啟動)之外被啟動。就像之前描述的一樣, 這種情況下標準特性就是當前和任務和新的活動的親和性匹配的任務將會切換到前台,然後在最頂端啟動一個新的活動。當然,你也可以實現其它類型的特性。

一個常用的做法就是將Intent.FLAG_ACTIVITY_CLEAR_TOP 和NEW_TASK一起使用。這樣做,如果你的任務已經處於運行中,任務將會被切換到前台來, 在棧裡的所有的活動除了根活動,都將被清空,根活動的onNewIntent(Intent) 方法傳入意圖參數後被調用。當使用這種方法的時候 singleTop 或者 singleTask啟動模式經常被使用,這樣當前執行個體會被置入一個新的意圖,而不是銷毀原先的任務然後啟動一個新的執行個體。

另外你可以使用的一個方法是設定活動的任務親和力為空白字串(表示沒有親和力),然後設定finishOnBackground屬性。 如果你想讓使用者給你提供一個單獨的活動描述的通知,倒不如返回到應用的任務裡,這個比較管用。要指定這個屬性,不管使用者使用BACK還是HOME,活動都會結束;如果這個屬性沒有指定,按HOME鍵將會導致活動以及任務還留在系統裡,並且沒有辦法返回到該任務裡。

進程

在Android中,進程是應用程式的完整實現,而不是使用者通常瞭解的那樣。他們主要用途很簡單:
◆提高穩定性和安全性,將不信任或者不穩定的代碼移動到其他進程。 
◆可將多個.apk包運行在同一個進程裡減少系統開銷。 
◆協助系統管理資源,將重要的代碼放在一個單獨的進程裡,這樣就可以單獨銷毀應用程式的其他部分。

像前面描述的一樣,進程的屬性被用來控制那些有特殊應用組件啟動並執行進程。注意這個屬性不能違反系統安全: 如果兩個.apk包不能共用同一個使用者ID,卻試圖運行在通一個進程裡,這種情況是不被允許的,事實上系統將會建立兩個不同的進程。

線程

每個進程包含一個或多個線程。多數情況下,Android 避免在進程裡建立多餘的線程,除非它建立它自己的線程,我們應保持應用程式的單線程性。 一個重要的結論就是所有呼叫執行個體, 廣播接收器, 以及 服務的執行個體都是由這個進程裡啟動並執行主線程建立的。

注意新的線程不是為活動,廣播接收器,服務或者內容提供器執行個體建立:這些應用程式的組件在進程裡被執行個體化(除非另有說明,都在同一個進程處理),實際上是進程的主線程。這說明當系統調用時這些組件(包括服務)不需要進程遠距離或者封鎖操作(就像網路呼叫或者計算迴圈),因為這將阻止進程中的所有其他組件。你可以使用標準的線程 類或者Android的HandlerThread 類去對其它線程執行遠程操作。

這裡有一些關於建立線程規則的例外:

呼叫IBinder或者IBinder實現的介面,如果該呼叫來自其他進程,你可以通過線程發送的IBinder或者本地進程中的線程池呼叫它們,從進程的主線程呼叫是不可以的。特殊情況下,,呼叫一個服務 的IBinder可以這樣處理。(雖然在服務裡來電者法在主線程裡已經完成。)這意味著IBinder介面的實現必須要有一種安全執行緒的方法,這樣任意線程才能同時訪問它。

呼叫由正在被調用的線程或者主線程以及IBinder派發的內容提供器 的主方法。被指定的方法在內容提供器的類裡有記錄。這意味著實現這些方法必須要有一種安全執行緒的模式,這樣任意其它線程同時可以訪問它。

呼叫視圖以及由視圖裡正在啟動並執行線程組成的子類。通常情況下,這會被作為進程的主線程,如果你建立一個線程並顯示一個視窗,那麼繼承的視窗視圖將從那個線程裡啟動。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.