參考資料:
Android官方API
《第一行代碼——Android》郭霖
Android 系統(tǒng)四大組件分別是活動(Activity)、服務(wù)(Service)、廣播接收器(BroadcastReceiver)和內(nèi)容提供器(Content Provider)。其中活動是所有 Android 應(yīng)用程序的門面,凡是在應(yīng)用中你看得到的東西,都是放在活動中的。而服務(wù)就比較低調(diào)了,你無法看到它,但它會一直在后臺默默地運行,即使用戶退出了應(yīng)用,服務(wù)仍然是可以繼續(xù)運行的。廣播接收器可以允許你的應(yīng)用接收來自各處的廣播消息,比如電話、短信等,當(dāng)然你的應(yīng)用同樣也可以向外發(fā)出廣播消息。內(nèi)容提供器則為應(yīng)用程序之間共享數(shù)據(jù)提供了可能,比如你想要讀取系統(tǒng)電話簿中的聯(lián)系人,就需要通過內(nèi)容提供器來實現(xiàn)。
下面我們就來說說四大組件之一活動。
1 返回棧
Android 中的活動是可以層疊的。我們每啟動一個新的活動,就會覆蓋在原活動之上,然后點擊 Back 鍵會銷毀最上面的活動,下面的一個活動就會重新顯示出來。
其實 Android 是使用任務(wù)(Task)來管理活動的,一個任務(wù)就是一組存放在棧里的活動的集合,這個棧也被稱作返回棧(Back Stack)。棧是一種后進先出的數(shù)據(jù)結(jié)構(gòu),在默認情況下,每當(dāng)我們啟動了一個新的活動,它會在返回棧中入棧,并處于棧頂?shù)奈恢谩6慨?dāng)我們按下 Back 鍵或調(diào)用 finish()方法去銷毀一個活動時,處于棧頂?shù)幕顒訒鰲?這時前一個入棧的活動就會重新處于棧頂?shù)奈恢?。系統(tǒng)總是會顯示處于棧頂?shù)幕顒咏o用戶。

2 活動狀態(tài)
每個活動在其生命周期中最多可能會有四種狀態(tài)。
1. 運行狀態(tài)
當(dāng)一個活動位于返回棧的棧頂時,這時活動就處于運行狀態(tài)。系統(tǒng)最不愿意回收的就是處于運行狀態(tài)的活動,因為這會帶來非常差的用戶體驗。
2. 暫停狀態(tài)
當(dāng)一個活動不再處于棧頂位置,但仍然可見時,這時活動就進入了暫停狀態(tài)。你可能會覺得既然活動已經(jīng)不在棧頂了,還怎么會可見呢?這是因為并不是每一個活動都會占滿整個屏幕的,比如對話框形式的活動只會占用屏幕中間的部分區(qū)域,你很快就會在后面看到這種活動。處于暫停狀態(tài)的活動仍然是完全存活著的,系統(tǒng)也不愿意去回收這種活動(因為它還是可見的,回收可見的東西都會在用戶體驗方面有不好的影響),只有在內(nèi)存極低的情況下,系統(tǒng)才會去考慮回收這種活動。
3. 停止?fàn)顟B(tài)
當(dāng)一個活動不再處于棧頂位置,并且完全不可見的時候,就進入了停止?fàn)顟B(tài)。系統(tǒng)
仍然會為這種活動保存相應(yīng)的狀態(tài)和成員變量,但是這并不是完全可靠的,當(dāng)其他地方需要內(nèi)存時,處于停止?fàn)顟B(tài)的活動有可能會被系統(tǒng)回收。
4. 銷毀狀態(tài)
當(dāng)一個活動從返回棧中移除后就變成了銷毀狀態(tài)。系統(tǒng)會最傾向于回收處于這種狀態(tài)的活動,從而保證手機的內(nèi)存充足。
3 活動的生存期
Activity 類中定義了七個回調(diào)方法,覆蓋了活動生命周期的每一個環(huán)節(jié),下面我來一一介紹下這七個方法。
1. onCreate()
這個方法你已經(jīng)看到過很多次了,每個活動中我們都重寫了這個方法,它會在活動第一次被創(chuàng)建的時候調(diào)用。你應(yīng)該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件等。
2.onStart()
這個方法在活動由不可見變?yōu)榭梢姇r調(diào)用。
3.onResume()
這個方法在活動準備好和用戶進行交互的時候調(diào)用。此時的活動一定位于返回棧的棧頂,并且處于運行狀態(tài)。
4. onPause()
這個方法在系統(tǒng)準備去啟動或者恢復(fù)另一個活動的時候調(diào)用。我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉,以及保存一些關(guān)鍵數(shù)據(jù),但這個方法的執(zhí)行速度一定要快,不然會影響到新的棧頂活動的使用。
5. onStop()
這個方法在活動完全不可見的時候調(diào)用。它和 onPause()方法的主要區(qū)別在于,如果啟動的新活動是一個對話框式的活動,那么 onPause()方法會得到執(zhí)行,而 onStop()方法并不會執(zhí)行。
6.onDestroy()
這個方法在活動被銷毀之前調(diào)用,之后活動的狀態(tài)將變?yōu)殇N毀狀態(tài)。
7.onRestart()
這個方法在活動由停止?fàn)顟B(tài)變?yōu)檫\行狀態(tài)之前調(diào)用,也就是活動被重新啟動了。以上七個方法中除了onRestart()方法,其他都是兩兩相對的,從而又可以將活動分為三種生存期。
1. 完整生存期
活動在 onCreate()方法和 onDestroy()方法之間所經(jīng)歷的,就是完整生存期。一般情況下,一個活動會在onCreate()方法中完成各種初始化操作,而在 onDestroy()方法中完成釋放內(nèi)存的操作。
2. 可見生存期
活動在 onStart()方法和 onStop()方法之間所經(jīng)歷的,就是可見生存期。在可見生存期內(nèi),活動對于用戶總是可見的,即便有可能無法和用戶進行交互。我們可以通過這兩個方法,合理地管理那些對用戶可見的資源。比如在 onStart()方法中對資源進行加載,而在 onStop()方法中對資源進行釋放,從而保證處于停止?fàn)顟B(tài)的活動不會占用過多內(nèi)存。
3. 前臺生存期
活動在onResume()方法和 onPause()方法之間所經(jīng)歷的,就是前臺生存期。在前臺生存期內(nèi),活動總是處于運行狀態(tài)的,此時的活動是可以和用戶進行相互的,我們平時看到和接觸最多的也這個狀態(tài)下的活動。
