Android的活動是層疊的,每啟動一個新的活動,就會覆蓋在原活動之上(類似于iOS的push,后進先出),按下Back鍵,移除棧頂?shù)幕顒?顯示下面的活動.
Android使用(Task)來管理活動,一個任務(wù)就是一組活動的集合,這個棧被稱為返回棧(Back Stack).(恰恰iOS也是如此,push的界面也是以數(shù)組進行存儲的).
Android點擊Back鍵,調(diào)用finish( )方法,銷毀當(dāng)前棧頂活動.iOS則為調(diào)用pop方法,移除當(dāng)前控制器.
活動狀態(tài)
先來下iOS的:
Not running:未運行,程序沒啟動 Inactive:未激活,程序在前臺運行,不過沒有接收到事件。在沒有事件處理情況下程序通常停留在這個狀態(tài) Active:激活,程序在前臺運行而且接收到了事件。這也是前臺的一個正常的模式 Backgroud:后臺,程序在后臺而且能執(zhí)行代碼,大多數(shù)程序進入這個狀態(tài)后會在在這個狀態(tài)上停留一會。時間到之后會進入掛起狀態(tài)(Suspended)。有的程序經(jīng)過特殊的請求后可以長期處于Backgroud狀態(tài) Suspended:掛起,程序在后臺不能執(zhí)行代碼。系統(tǒng)會自動把程序變成這個狀態(tài)而且不會發(fā)出通知。當(dāng)掛起時,程序還是停留在內(nèi)存中的,當(dāng)系統(tǒng)內(nèi)存低時,系統(tǒng)就把掛起的程序清除掉,為前臺程序提供更多的內(nèi)存。
然后是Android的:
Running state:位于返回棧頂部的活動處于運行狀態(tài).系統(tǒng)對于運行狀態(tài)的活動,很不樂意回收.因為這會產(chǎn)生很不好的用戶體驗. Hold state:當(dāng)一個活動不再處于棧頂位置,但仍然可見時,這時活動就進入了暫停狀態(tài).(只要活動不會占滿整個屏幕,處于暫停狀態(tài)的活動就是存活的,因為它存活,系統(tǒng)也不樂意去回收,糟糕的用戶體驗). Stop state:當(dāng)活動不再處于棧頂,而且完全不可見時,就進入了停止?fàn)顟B(tài).系統(tǒng)仍會為這種活動保存響應(yīng)的狀態(tài)和成員變量.但這是不穩(wěn)定的,因為,當(dāng)其他地方需要內(nèi)存時,這種活動就會被回收. Destruction of state:當(dāng)一個活動從返回棧中移除后就變成了銷毀狀態(tài),系統(tǒng)最喜歡回收這種狀態(tài)的活動,因為這并不會帶來糟糕的用戶體驗.
對比發(fā)現(xiàn),沒錯,Android有點小坑了.處于停止?fàn)顟B(tài)的活動,有被回收的風(fēng)險.這里就沒有iOS的push好了.
活動的生存期
Activity類中定義了七個回調(diào)方法,覆蓋活動生命周期的每一個環(huán)節(jié): onCreat( ):活動第一次被創(chuàng)建的時候調(diào)用.在這里,我們會完成活動的初始化操作,例如加載布局,綁定事件等. onStart( ):活動由不可見變?yōu)榭梢姷臅r候調(diào)用. onResume( ):活動準(zhǔn)備好和用戶進行交互的時候調(diào)用.此時的活動一定是位于棧頂,并處于運行狀態(tài).(能與用戶交互,首先要用戶看得到界面). onPause( ):系統(tǒng)準(zhǔn)備去啟動或者恢復(fù)另一個活動的時候調(diào)用.通常在這個時候,我們會將一些消耗CPU的資源釋放掉,以及保存一些關(guān)鍵數(shù)據(jù),但這個方法一定執(zhí)行要快(執(zhí)行要快?要快?要快?有安卓大神可以解釋一下嗎?),不然會影響到棧頂活動的使用. onStop( ):活動完全不可見的時候調(diào)用.和上面方法不同的是,如果啟動的新活動是一個對話框形式的活動,那么onPause( )方法就會被執(zhí)行,而onStop( )方法并不會執(zhí)行.(請聯(lián)系上文的暫停狀態(tài)). onDestory( ):活動被銷毀之前調(diào)用,之后活動的狀態(tài)將變?yōu)殇N毀狀態(tài). onRestart( ):活動由停止?fàn)顟B(tài)變?yōu)檫\行狀態(tài)之前調(diào)用,也就是活動被重新啟動了.
根據(jù)上述七個方法,除onRestart()以外,均為兩兩相對,又可以將活動分為3種生存期:
完整生存期:活動處于onCreat()方法和onDestory()之間,就是完整生存期.一個活動會在onCreat()中完成各種初始化操作,而在onDestory()中完成釋放內(nèi)存的操作. 可見生存期:活動在onStart()和onStop()之間經(jīng)歷的,就是可見生存期.在此期間,活動對于用戶總是可見的,即便有可能無法和用戶進行交互.我們可以通過這兩個方法,合理地管理那些對用戶可見的資源.可以在onStart()方法中,對資源進行加載,而在onStop()中進行釋放,以保證處于停止?fàn)顟B(tài)的活動不會占用過多內(nèi)存. 前臺生存期:活動在onResume()方法和onPause()方法之間所經(jīng)歷的就是前臺生存期.在前臺生存期內(nèi),活動總是處于運行狀態(tài)的,此時的活動是可以和用戶進行交互的,我們平時看到和接觸最多的也就是這個狀態(tài)下的活動.
iOS的控制器:
當(dāng)一個視圖控制器被創(chuàng)建,并在屏幕上顯示的時候。 代碼的執(zhí)行順序 1、 alloc 創(chuàng)建對象,分配空間 2、init (initWithNibName) 初始化對象,初始化數(shù)據(jù) 3、loadView 從nib載入視圖 ,通常這一步不需要去干涉。除非你沒有使用xib文件創(chuàng)建視圖 4、viewDidLoad 載入完成,可以進行自定義數(shù)據(jù)以及動態(tài)創(chuàng)建其他控件 5、viewWillAppear 視圖將出現(xiàn)在屏幕之前,馬上這個視圖就會被展現(xiàn)在屏幕上了 6、viewDidAppear 視圖已在屏幕上渲染完成 當(dāng)一個視圖被移除屏幕并且銷毀的時候的執(zhí)行順序,這個順序差不多和上面的相反 1、viewWillDisappear 視圖將被從屏幕上移除之前執(zhí)行 2、viewDidDisappear 視圖已經(jīng)被從屏幕上移除,用戶看不到這個視圖了 3、dealloc 視圖被銷毀,此處需要對你在init和viewDidLoad中創(chuàng)建的對象進行釋放
兩者對比下,個人感覺iOS的更清晰明了.暫時先寫到這里,接下來會對不清楚的細節(jié),進一步研究下.