編輯:Android開發實例
前言
在一個Android應用中,不可避免的會包含多個Activity,當開啟多個Activity之後,當按後退鍵時,一般會回退到上一個Activity,這一點和浏覽器有點類似,但是需要注意的是Android系統只能回退到上一個Activity,沒辦法前進到下一個Activity,維護這個功能就需要了解到一個回退棧(Back Stack)的概念。
本文就著重講
什麼是回退棧?
首先先來了解一下應用程序與進程的關系,眾所周知,Android下有四大組件:Activity、Service、Receiver、ContentProvider。一般開發一個應用程序,會包含多個Android組件,所以應用程序是一組組件的集合,而進程則是運行這些組件的載體。
而回退棧(Back Stack)只是針對Activity而言的,它是用來維護用的界面體驗的,使一個Task讓用戶感覺就是一個應用,而無論其中的Activity是否來自同一個應用程序,所以不要把回退棧和進程弄混了。設備的Home頁面是大多數Task的起始位置,當用戶點擊一個應用程序圖標的時候,應用的Task就會來到前台,並把應用的主Activity壓入BackStack的棧頂,並獲得焦點,這個Activity稱為根Activity,而在BackStack中的Activity可以通過點擊回退鍵彈出棧並銷毀,這時就會使上一個Activity獲得焦點,直到用戶返回到Home頁,而當BackStack中的Activity都被彈出銷毀之後,這個Task就不復存在了,但是這個程序的進程還存在(不在此時銷毀)。
Task的狀態
就像上面介紹的,每個Task都存在一個BackStack,而系統中可以存在多個Task,但是每次只有一個Task獲得前台焦點,一般而言,系統允許用戶在多個Task中切換,而被至於後台的Task中的Activity,將被置於Stopped狀態。實際上,同一個Task中的Activity,只要不存在於棧頂並且獲得前台焦點的Activity,那麼它就是一個Stopped的狀態。下圖為官方文檔中關於Task前後台的示例圖:
Activity的啟動模式
根據Activity的不同的啟動模式,它在BackStack中的狀態是不一樣的。Activity可以通過AndroidManifest.xml清單文件配置,在<Activity />節點中的android:launchMode屬性設置。它有四個選項:
standard
標准啟動模式,也是默認啟動模式,如果不設置android:launchMode屬性的話。standard模式下的Activity會依照啟動的順序壓入BackStack中。
下圖是standard模式下,Activity的壓棧和回退操作示意圖:
singleTop
單頂模式,這種Activity啟動模式,啟動一個Activity的時候如果發現BackStack的棧頂已經存在這個Activity了,就不會去重新創建新的Activity,而是復用這個棧頂已經存在的Activity,避免同一個Activity被重復開啟。
下圖是singleTop模式下,Activity的壓棧和回退操作示意圖:
singleTop的應用場景很多,一般適用於可以復用而又有多個開啟渠道的Activity,避免當一個Activity已經開啟並獲得焦點後,再次重復開啟。比如說Android系統浏覽器的書簽頁面,就是一個singleTop模式的Activity。Android的浏覽器是基於WebKit內核編寫的,它是支持JavaScript腳本語言的,可以通過JavaScript腳本設置浏覽器書簽,這樣如果存在多個頁面存在保存書簽的JavaScript腳本,就會導致書簽頁面被多次開啟,所以書簽頁面被設置為singleTop模式,這樣可以避免在保存多個書簽的時候重復開啟書簽頁面。
singleTask
開啟一個Activity的時候,檢查BackStack裡面是否有這個Activity的實例存在,如果存在的話,情況BackStack裡這個Activity上所有的其他Activity。
下圖是singleTask模式下,Activity的壓棧和回退操作示意圖:
singleTask的的適用場景為一般程序的主頁面,當回退到主頁面的時候,清除BackStack中,它之上的所有Activity,這樣避免程序導航邏輯的混亂。比如Android系統的浏覽器的主頁面,就是singleTask模式的,上面提到,android下浏覽器是Webkit內核的,它是由C語言編寫的,而每次打開新的網頁如果重新開啟一個Activity,是非常耗費系統資源的(需要解析HTML、Script腳本),所以被設置為singleTask模式,這樣在浏覽器應用裡,無論打開多少個頁面,使用的都是同一個Activity。所以以後如果存在很耗費系統資源的Activity,可以考慮使用singleTask開啟模式。
singleInstance
被標記為singleInstance啟動模式的Activity,在啟動的時候,會開啟一個新的BackStack,這個BackStack裡只有一個Activity的實例存在,並且把這個BackStack獲得焦點。這是一種很極端的模式,它會導致整個設備的操作系統裡,只會存在一個這個Activity示例,無論是從何處被啟動的。
下圖是singleInstance模式下,Activity的壓棧和回退操作示意圖:
singleInstance一般適用於需要在系統中只存在一個實例的場景,比如Android系統的來電頁面,多次來電均使用的是一個Activity。
當然,在Android中,除了在AndroidManifest.xml清單文件中配置LauncherMode屬性外,還可以在代碼中設置啟動模式。在組件中,啟動一個Activity,需要用到startActivity()方法,其中傳遞一個Intent,可以使用Intent.setFlags(int flags)來設置新啟動的Activity的啟動模式,而通過代碼設置Activity的啟動模式的方式,優先級要高於在AndroidManifest.xml清單文件中的配置。
Intent.setFlag(int flags)方法傳遞的一個整形的數據,被Android系統設置為了常量:
總結
本文主要講的是理論上的內容,也沒什麼示例代碼,無非就是幾種啟動模式的特點需要注意一下,理解了Activity的啟動模式,可以很好的提升用戶的UI體驗,對應用程序的推廣是非常有好處的,畢竟一個用戶體驗很差的應用,是很難得到用戶的推廣的。
今天開始模仿開發者頭條的側滑菜單,是本系列第二篇文章,相信大家已經看到很多app使用這種側滑。今天我來教大家用Android自帶DrawerLayo
欣賞一下我們清爽的界面吧~ 如果是只用activity來制作這樣的東西簡直是太小兒科了,此處我們當然用的是service 首先我們先上service的代碼: 1
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我