基礎篇(一)

返回棧概念:
   Android 是使用任務(Task)來管理活動的,一個任務就是一組存放在棧裏的活動
 的集合,這個棧也被稱做返回棧(Back Stack) 。棧是一種後進先出的數據結構,在默認狀況
 下,每當咱們啓動了一個新的活動,它會在返回棧中入棧,並處於棧頂的位置。而每當咱們
 按下 Back 鍵或調用 finish()方法去銷燬一個活動時,處於棧頂的活動會出棧,這時前一個入
 棧的活動就會從新處於棧頂的位置。系統老是會顯示處於棧頂的活動給用戶。    java

 

    1、項目文件夾的說明
1.  src
毫無疑問,src 目錄是放置咱們全部 Java 代碼的地方,它在這裏的含義和普通 Java
項目下的 src 目錄是徹底同樣的,展開以後你將看到咱們剛纔建立的 HelloWorldActivity
文件就在裏面。
2.  gen
這個目錄裏的內容都是自動生成的,主要有一個 R.java 文件,你在項目中添加的任
何資源都會在其中生成一個相應的資源 id。這個文件永遠不要手動去修改它。
3.  assets
這個目錄用得很少,主要能夠存放一些隨程序打包的文件,在你的程序運行時能夠
動態讀取到這些文件的內容。另外,若是你的程序中使用到了 WebView 加載本地網頁
的功能,全部網頁相關的文件也都存放在這個目錄下。
4.  bin
這個目錄你也不須要過多關注,它主要包含了一些在編譯時自動產生的文件。其中
會有一個你當前項目編譯好的安裝包,展開 bin 目錄你會看到 HelloWorld.apk,把這個
文件拷到手機上就能夠直接安裝了。
5.  libs
若是你的項目中使用到了第三方 Jar包, 就須要把這些 Jar包都放在 libs目錄下, 放
在這個目錄下的 Jar 包都會被自動添加到構建路徑裏去。 你能夠展開上圖中 Android 4.0、
Android Private Libraries、Android Dependencies這些庫,其中顯示的 Jar 包都是已經被
添加到構建路徑裏的。
6.  res
這個目錄下的內容就有點多了,簡單點說,就是你在項目中使用到的全部圖片、布
局、字符串等資源都要存放在這個目錄下,前面提到的 R.java 中的內容也是根據這個目
錄下的文件自動生成的。 固然這個目錄下還有不少的子目錄, 圖片放在 drawable目錄下,
佈局放在 layout 目錄下,字符串放在 values 目錄下,因此你不用擔憂會把整個 res目錄
弄得亂糟糟的。
7.  AndroidManifest.xml
這是你整個 Android項目的配置文件,你在程序中定義的全部四大組件都須要在這
個文件裏註冊。另外還能夠在這個文件中給應用程序添加權限聲明,也能夠從新指定你
建立項目時指定的程序最低兼容版本和目標版本。因爲這個文件之後會常常用到,咱們
用到的時候再作詳細說明。
8.  project.properties
這個文件很是地簡單,就是經過一行代碼指定了編譯程序時所使用的 SDK 版本。
咱們的 HelloWorld項目使用的是 API 14,你也能夠在這裏改爲其餘版本試一試。
這樣整個項目的目錄結構就都介紹完了,若是你還不能徹底理解的話也很正常,畢竟裏
面有太多的東西你都還沒接觸過。不用擔憂,這並不會影響到你後面的學習。相反,等你學
完整本書後再回來看這個目錄結構圖時,你會以爲特別地清晰和簡單。android

 
    2、日誌工具的說明
1.  Log.v()
這個方法用於打印那些最爲瑣碎的,意義最小的日誌信息。對應級別 verbose,是
Android 日誌裏面級別最低的一種。
2.  Log.d()
這個方法用於打印一些調試信息, 這些信息對你調試程序和分析問題應該是有幫助
的。對應級別 debug,比 verbose高一級。
3.  Log.i()
這個方法用於打印一些比較重要的數據,這些數據應該是你很是想看到的,能夠幫
你分析用戶行爲的那種。對應級別 info,比 debug高一級。
4.  Log.w()
這個方法用於打印一些警告信息,提示程序在這個地方可能會有潛在的風險,最好
去修復一下這些出現警告的地方。對應級別 warn,比 info高一級。
5.  Log.e()
這個方法用於打印程序中的錯誤信息,好比程序進入到了 catch 語句當中。當有錯
誤信息打印出來的時候,通常都表明你的程序出現嚴重問題了,必須儘快修復。對應級
別 error,比 warn高一級。數據結構

    3、開發中的小細節
1.隱藏標題欄:
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE); //不在活動中顯示標題欄
 setContentView(R.layout.first_layout);
}
2.Toast提醒方式使用:工具


    4、活動狀態
1.運行狀態
 當一個活動位於返回棧的棧頂時,這時活動就處於運行狀態。系統最不肯意回收的
 就是處於運行狀態的活動,由於這會帶來很是差的用戶體驗。
2.  暫停狀態
 當一個活動再也不處於棧頂位置,但仍然可見時,這時活動就進入了暫停狀態。你可
 能會以爲既然活動已經不在棧頂了, 還怎麼會可見呢?這是由於並非每個活動都會
 佔滿整個屏幕的,好比對話框形式的活動只會佔用屏幕中間的部分區域,你很快就會在
 後面看到這種活動。處於暫停狀態的活動仍然是徹底存活着的,系統也不肯意去回收這
 種活動(由於它仍是可見的,回收可見的東西都會在用戶體驗方面有很差的影響) ,只
 有在內存極低的狀況下,系統纔會去考慮回收這種活動。
3.  中止狀態
 當一個活動再也不處於棧頂位置,而且徹底不可見的時候,就進入了中止狀態。系統
 仍然會爲這種活動保存相應的狀態和成員變量,可是這並非徹底可靠的,當其餘地方
 須要內存時,處於中止狀態的活動有可能會被系統回收。
4.  銷燬狀態
 當一個活動從返回棧中移除後就變成了銷燬狀態。 系統會最傾向於回收處於這種狀
 態的活動,從而保證手機的內存充足。佈局


    5、活動的生存週期
1.onCreate()
 這個方法你已經看到過不少次了,每一個活動中咱們都重寫了這個方法,它會在活動
 第一次被建立的時候調用。你應該在這個方法中完成活動的初始化操做,好比說加載布
 局、綁定事件等。
2.  onStart()
 這個方法在活動由不可見變爲可見的時候調用。
3.  onResume()
 這個方法在活動準備好和用戶進行交互的時候調用。 此時的活動必定位於返回棧的
 棧頂,而且處於運行狀態。
4.  onPause()
 這個方法在系統準備去啓動或者恢復另外一個活動的時候調用。 咱們一般會在這個方
 法中將一些消耗 CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度
 必定要快,否則會影響到新的棧頂活動的使用。
5.  onStop()
 這個方法在活動徹底不可見的時候調用。它和 onPause()方法的主要區別在於,如
 果啓動的新活動是一個對話框式的活動,那麼 onPause()方法會獲得執行,而 onStop()
 方法並不會執行。
6.  onDestroy()
 這個方法在活動被銷燬以前調用,以後活動的狀態將變爲銷燬狀態。
7.  onRestart()
 這個方法在活動由中止狀態變爲運行狀態以前調用,也就是活動被從新啓動了。
8.  onSaveInstanceState(Bundle outState)
 這個方法會保證必定在活動被系統回收以前調用, 所以咱們能夠經過這個方法來解決活動被回收時
 臨時數據得不到保存的問題。被保存的數據會在onCreate(Bundle savedInstanceState)中傳入,經過Bundle來獲取。學習

以上七個方法中除了 onRestart()方法,其餘都是兩兩相對的,從而又能夠將活動分爲三
 種生存期。
1.  完整生存期
 活動在 onCreate()方法和 onDestroy()方法之間所經歷的,就是完整生存期。通常情
 況下,一個活動會在 onCreate()方法中完成各類初始化操做,而在 onDestroy()方法中完
 成釋放內存的操做。
2.  可見生存期
 活動在 onStart()方法和 onStop()方法之間所經歷的,就是可見生存期。在可見生存
 期內,活動對於用戶老是可見的,即使有可能沒法和用戶進行交互。咱們能夠經過這兩
 個方法,合理地管理那些對用戶可見的資源。好比在 onStart()方法中對資源進行加載,
 而在 onStop()方法中對資源進行釋放, 從而保證處於中止狀態的活動不會佔用過多內存。
3.  前臺生存期
 活動在 onResume()方法和 onPause()方法之間所經歷的,就是前臺生存期。在前臺
 生存期內,活動老是處於運行狀態的,此時的活動是能夠和用戶進行相互的,咱們平時
 看到和接觸最多的也這個狀態下的活動。debug

   6、活動的啓動模式
 啓動模式一共有四種,分別是 standard、singleTop、singleTask 和 singleInstance,能夠在 AndroidManifest.xml 中經過給<activity>標籤指定
 android:launchMode屬性來選擇啓動模式。
1.standard
  standard 是活動默認的啓動模式,在不進行顯式指定的狀況下,全部活動都會自動使用
 這種啓動模式。所以,到目前爲止咱們寫過的全部活動都是使用的 standard模式。通過上一
 節的學習,你已經知道了 Android 是使用返回棧來管理活動的,在 standard 模式(即默認情
 況)下,每當啓動一個新的活動,它就會在返回棧中入棧,並處於棧頂的位置。對於使用
 standard 模式的活動,系統不會在意這個活動是否已經在返回棧中存在,每次啓動都會建立
 該活動的一個新的實例。調試

2.singleTop
  可能在有些狀況下,你會以爲 standard模式不太合理。活動明明已經在棧頂了,爲何
 再次啓動的時候還要建立一個新的活動實例呢?彆着急, 這只是系統默認的一種啓動模式而
 已,你徹底能夠根據本身的須要進行修改,好比說使用 singleTop 模式。當活動的啓動模式
 指定爲 singleTop, 在啓動活動時若是發現返回棧的棧頂已是該活動, 則認爲能夠直接使用
 它,不會再建立新的活動實例。若是棧頂不是該活動時,仍是會從新建立該活動的。日誌

3.singleTask
  使用 singleTop 模式能夠很好地解決重複建立棧頂活動的問題,可是正如你在上一節所
 看到的,若是該活動並無處於棧頂的位置,仍是可能會建立多個活動實例的。那麼有沒有
 什麼辦法可讓某個活動在整個應用程序的上下文中只存在一個實例呢?這就要藉助
 singleTask模式來實現了。當活動的啓動模式指定爲 singleTask,每次啓動該活動時系統首先
 會在返回棧中檢查是否存在該活動的實例,若是發現已經存在則直接使用該實例,並把在這
 個活動之上的全部活動通通出棧,若是沒有發現就會建立一個新的活動實例。xml

4.singleInstance
  singleInstance 模式應該算是四種啓動模式中最特殊也最複雜的一個了, 你也須要多花點
 功夫來理解這個模式。 不一樣於以上三種啓動模式, 指定爲 singleInstance 模式的活動會啓用一
 個新的返回棧來管理這個活動(其實若是 singleTask模式指定了不一樣的 taskAffinity,也會啓
 動一個新的返回棧) 。那麼這樣作有什麼意義呢?想象如下場景,假設咱們的程序中有一個
 活動是容許其餘程序調用的, 若是咱們想實現其餘程序和咱們的程序能夠共享這個活動的實
 例,應該如何實現呢?使用前面三種啓動模式確定是作不到的,由於每一個應用程序都會有自
 己的返回棧,同一個活動在不一樣的返回棧中入棧時必然是建立了新的實例。而使用
 singleInstance 模式就能夠解決這個問題, 在這種模式下會有一個單獨的返回棧來管理這個活
 動,無論是哪一個應用程序來訪問這個活動,都共用的同一個返回棧,也就解決了共享活動實
 例的問題。(可在活動中調用getTaskId()來查看該活動在哪一個棧中)

活動生命週期圖:

相關文章
相關標籤/搜索