幻之旅程
Activity和Task是Android Application Framework架構中最基礎的應用,開發者必須清楚它們的用法和一些開發技巧。本文用大量的篇幅並通過引用實例的方式一步步深入全面講解它們的基礎原理(underlying principles)和架構(mechanisms),例如:Navigation、Multitasking、activity re-use、intents和activity stack等…大部分與其相關的應用模塊。重點講解開發過程中如何更準確的體現用戶交互性的便捷和高效,同時也幫助分析Designers和 Developers在開發期間所要面對的問題。
文中涉及到的實例有一部分是屬於平臺自帶的application(例如:撥號程序等),另外也有Google產品線中的一些有代表性的應用(例如:Google Map等)。建議大傢親自利用Emulator或者Android-powered device測試實例中的效果,這樣可以幫助更加清晰的理解一些模塊的含義。(註意:可能會因為硬件對於某些功能無法提供支持,所以有一些實例可能無法在你的測試機中正常瀏覽)
首先需要清楚一些基礎模塊:
- Applications
- Acitivities
- Activity Stack
- Tasks
以上這四個模塊對於理解這篇文章非常重要,下邊就來逐一的簡單介紹其具體的含義和用法(也可以通過其鏈接直接查看官方文檔)。
Applications
任何一個Android Application基本上是由一些Activities組成,當用戶與應用程序交互時其所包含的部分Activities具有緊密的邏輯關系,或者各自獨立處理不同的響應。這些Activities捆綁在一起成為瞭一個處理特定需求的Application, 並且以“.apk”作為後綴名存在於文件系統中。Android平臺默認下的應用程序例如:Email、Calendar、Browser、Maps、Text Message、Contacts、Camera和Dialer等都是一個個獨立的Apps。
Activities
上邊已經提到Activities是構成Applications的主要組成部分,其實可以更為具體的理解為Application僅僅是一個抽象的標簽,它將系統內一部分Activities關聯在一起,協同完成用戶的特定需求。安裝 Application的過程也可以簡單理解為將其所包裹的Activities導入到當前的系統中,如果系統中已經存在瞭相同的Activities,那麼將會自動將其關聯,而不會重復安裝相同的Activities,避免資源的浪費。Application卸載的過程也會檢查當前所關聯的 Activities是否有被其它Application標簽所關聯,如果僅僅是提供當前的Application使用,那麼將會徹底被移除,相反則不做任何操作。
用戶與Application的交互行為大部分都是通過GUI來完成,在Android平臺可以有兩種方式定義GUI,其中可以利用XML來預置靜態的GUI元素,或者在Activity類的內部動態定義GUI元素。這兩種不同的方法都是由 Activity作為驅動和響應用戶交互事件的主體。當啟動Application之後,至少需要一個包含有GUI信息的Activity實例被創建。
Activity的主體包括兩個主要部分,其中一個是Content(data),另外一個是響應用戶交互事件的行為。列舉一個Dialer例子的截圖,其中包括四個部分:Dialer主界面、通訊錄、查看聯系人信息和添加新聯系人。
下面列舉瞭更多比較有代表性的Applications和其所包含的Activities:
- Email – activities to view folders, view list of messages, view a message, compose a message, and set up an account
- Calendar – activities to view day, view week, view month, view agenda, edit an event, edit preferences, and view an alert
- Camera – activities for running the camera, viewing the list of pictures, viewing a picture, cropping a picture, running the camcorder, viewing the list of movies, and viewing a movie
- Game – one activity to play the game, typically another for setup
- Maps – one activity to view a location on a map, a second for lists (such as turn list or friend list), and a third for details (friend location, status, photo)
Application基本上是由四個模塊組成:Activity、Service、Content Provider 和 Broadcast Receiver,其中Activity是實現應用的主體。
Activity Stack
操作應用程序時,有時需要調用多個Activities來完成需求,例如:發送郵件程序,首先是進入郵件主界面,然後啟動一個新的Activity用於填寫新郵件內容,同時可以調出聯系人列表用於插入收件人信息等等。在這個操作過程中 Android平臺有一個專門用於管理Activities堆棧的機制,其可以方便的線性記錄Activities實例,當完成某個操作時,可以通過這個導航功能返回之前的Activity(通過按操作臺的“Back”)。
每次啟動新的Activity都將被添加到Activity Stack。用戶可以方便的返回上一個Activity直到Home Screen,到達Home Screen後,將無法再繼續查看堆棧記錄(俗話說:到頭瞭- Androidres.com)。如果當前Task被中止(Interrupting the task),返回到系統主界面後啟動瞭其它操作,當希望返回到前一個Task繼續執行時,隻需要再次通過主界面的Application launcher或者快捷方式啟動這個Task的Root Activity便可返回其中止時的狀態繼續執行。
相對於Views、Windows、Menus和Dialogs而言,Activity是唯一可被記錄在History stack中的數據,所以當你所設計的應用程序需要用戶由A界面進入到次一級界面B,當完成操作後需要再次返回A,那麼必須考慮將A看作為 Activity,否則將無法從歷史堆棧中返回。
Tasks
在Android平臺上可以將Task簡單的理解為由多個Activities共同協作完成某一項應用,而不管Activities具體屬於哪個 Application。通過下邊的圖示可以更清晰的理解Applications、Tasks、Activities三者之間的關系 (Androidres.com提供):
<IMG class="aligncenter size-full