Activity

生命周期流程圖:


Activity生命周期執(zhí)行過程:

(1)啟動(dòng)Activity:系統(tǒng)會(huì)先調(diào)用onCreate()方法,然后調(diào)用onStart()方法,最后調(diào)用onResume(),Activity進(jìn)入運(yùn)行狀態(tài)。界面可顯示

(2)當(dāng)Activty被其他Activity覆蓋上(例如Activity對(duì)話框)或者被鎖屏:系統(tǒng)會(huì)調(diào)用onPause()方法,暫停當(dāng)前Activity的執(zhí)行。

(3)當(dāng)Activity由其被覆蓋狀態(tài)回到前臺(tái)或解鎖屏:系統(tǒng)會(huì)調(diào)用onResume()方法,再次進(jìn)入運(yùn)行狀態(tài)演顾。

(4)當(dāng)Activity跳轉(zhuǎn)新的頁面或者Home回到主屏供搀,自身退到后臺(tái):系統(tǒng)會(huì)先調(diào)用onPause(),然后調(diào)用onStop()方法,進(jìn)入停止?fàn)顟B(tài)钠至。

(5)當(dāng)Activity由重新被啟用或者從上個(gè)跳回:系統(tǒng)會(huì)先調(diào)用onRestart()方法葛虐,然后調(diào)用onStart()方法,最后調(diào)用onResume()方法棉钧,再次進(jìn)入運(yùn)行狀態(tài)屿脐。

(6)當(dāng)Activity處于被覆蓋狀態(tài)或者后臺(tái)不可見狀態(tài),系統(tǒng)內(nèi)存不足時(shí)宪卿,殺死當(dāng)前Activity的诵,用戶返回時(shí):再次調(diào)用onCreate()->onStart()->onResume,進(jìn)入運(yùn)行狀態(tài)

(7)當(dāng)退出當(dāng)前Activity:系統(tǒng)先調(diào)用onPause()方法佑钾,然后調(diào)用onStop()方法西疤,最后調(diào)用onDestory()方法,結(jié)束當(dāng)前Activity休溶。

除了幾個(gè)常見的方法外代赁,介紹一下onWindowFocusChanged、onSaveInstanceState邮偎、onRestoreInstanceState幾個(gè)常用方法:

(1)onWindowFocusChanged():在Activity窗口獲得或者失去焦點(diǎn)的時(shí)候被調(diào)用管跺,例如首次創(chuàng)建界面顯示時(shí)义黎,當(dāng)Activity被其他Activity覆蓋禾进,跳轉(zhuǎn)到其他Activity或者Home回到主屏,退出當(dāng)前Activity廉涕。以上情況都會(huì)被調(diào)用onWindowFocusChanged(),并且當(dāng)Activity被創(chuàng)建時(shí)是在onResume()之后調(diào)用泻云,當(dāng)Activity被覆蓋或者退出或者在后臺(tái)時(shí), 它是在onPause()之后被調(diào)用狐蜕。

(2)onSaveInstanceState():(a)在Activity被覆蓋或者退后臺(tái)之后宠纯,系統(tǒng)資源不足將其殺死,此方法會(huì)被調(diào)用层释;(b)在用戶改變屏幕方向時(shí)會(huì)被調(diào)用婆瓜;(c)在當(dāng)前Activity跳轉(zhuǎn)到其他Activity或者Home回主屏,此方法會(huì)被調(diào)用贡羔。

(3)onRestoreInstanceState():(a)在Acitivity被覆蓋或者后臺(tái)時(shí)廉白,系統(tǒng)資源不足將其殺死,然后用戶又回到了Activity乖寒,此方法會(huì)被調(diào)用猴蹂;(b)在用戶改變屏幕方向時(shí)候會(huì)被調(diào)用。我們可以重寫這個(gè)方法以便可以恢復(fù)一些臨時(shí)數(shù)據(jù)楣嘁。onRestoreInstanceState()調(diào)用是在onStart()之后磅轻。


Activity四種啟動(dòng)模式

(1)standard 標(biāo)準(zhǔn)模式

standard模式是默認(rèn)的啟動(dòng)模式珍逸,不用配置<activity>android:lauchMode屬性即可,當(dāng)然也可以制定值為standard聋溜。不管有沒有已存在的實(shí)例谆膳,都生成新的實(shí)例。如下圖撮躁,每次跳轉(zhuǎn)都會(huì)在task中生成一個(gè)新的實(shí)例摹量,并且放在棧的頂部,回退的時(shí)候看到原來的實(shí)例馒胆。

(2)singTop 棧頂復(fù)用模式

配置<activity>指定屬性為android:lauchMode="singleTop"缨称,系統(tǒng)會(huì)按照singleTop啟動(dòng)模式處理跳轉(zhuǎn)行為。如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例正位于棧頂祝迂,則重復(fù)利用睦尽,不再生成新的實(shí)例。如果另一Activity處于棧頂型雳,跳轉(zhuǎn)其時(shí)生成新的實(shí)例当凡。singleTop模式的原理如下圖所示:

(3)singleTask 棧內(nèi)復(fù)用模式

配置<activity>指定屬性為android:lauchMode="singleTask",如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例,則使此Activity實(shí)例之上的其他Activity實(shí)例統(tǒng)統(tǒng)出棧纠俭,使此Activity實(shí)例成為棧頂對(duì)象沿量,顯示到幕前。singleTask模式的原理圖如下圖所示:

(4)singleInstance 單例模式

配置<activity>指定屬性為android:lauchMode="singleInstance"? singleInstance啟動(dòng)模式比較特殊冤荆,因?yàn)樗鼤?huì)啟用一個(gè)新的棧結(jié)構(gòu)朴则,將Acitvity放置于這個(gè)新的棧結(jié)構(gòu)中,并保證不再有其他Activity實(shí)例進(jìn)入钓简。修改FirstActivity的launchMode="standard"乌妒,SecondActivity的launchMode="singleInstance",我們發(fā)現(xiàn)這兩個(gè)Activity實(shí)例分別被放置在不同的棧結(jié)構(gòu)中外邓,關(guān)于singleInstance的原理圖如下:

如果我們修改FirstActivity的launchMode值為singleTop撤蚊、singleTask、singleInstance中的任意一個(gè)损话,流程將會(huì)如圖所示:

singleInstance啟動(dòng)模式可能是最復(fù)雜的一種模式侦啸,為了幫助大家理解,我舉一個(gè)例子丧枪,假如我們有一個(gè)share應(yīng)用光涂,其中的ShareActivity是入口Activity,也是可供其他應(yīng)用調(diào)用的Activity豪诲,我們把這個(gè)Activity的啟動(dòng)模式設(shè)置為singleInstance顶捷,然后在其他應(yīng)用中調(diào)用。我們編輯ShareActivity的配置:

<activity android:name=".ShareActivity" android:launchMode="singleInstance">

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="android.intent.action.MAIN" />

? ? ? ? ? ? ? ? <category android:name="android.intent.category.LAUNCHER" />

? ? ? ? ? ? </intent-filter>

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" />

? ? ? ? ? ? ? ? <category android:name="android.intent.category.DEFAULT" />

? ? ? ? ? ? </intent-filter>

? ? ? ? </activity>

然后我們?cè)谄渌麘?yīng)用中這樣啟動(dòng)該Activity:

Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE");

startActivity(intent);

當(dāng)我們打開ShareActivity后再按后退鍵回到原來界面時(shí)屎篱,ShareActivity做為一個(gè)獨(dú)立的個(gè)體存在服赎,如果這時(shí)我們打開share應(yīng)用葵蒂,無需創(chuàng)建新的ShareActivity實(shí)例即可看到結(jié)果,因?yàn)橄到y(tǒng)會(huì)自動(dòng)查找重虑,存在則直接利用践付。大家可以在ShareActivity中打印一下taskId,看看效果缺厉。關(guān)于這個(gè)過程永高,原理圖如下:



Activity啟動(dòng)模式的設(shè)置

啟動(dòng)模式設(shè)置有兩種方法:在mainifest中設(shè)置、通過Intent設(shè)置標(biāo)志提针。

(1)<activity

android:launchMode="standard"/>? standard 標(biāo)準(zhǔn)模式? singleTop 棧頂模式 singleTask 棧內(nèi)復(fù)用模式? singleInstance 單例模式命爬。

(2)通過Intent設(shè)置標(biāo)志

Intent inten=new Intent(ActivityA.this,ActivityB.class);??

Intent.addFlags(Intent.FlAG_ACTIVITY_NEW_TASK);?

?startActivity(intent);

標(biāo)記位屬性及含義

FLAG_ACTIVITY_SINGLE_TOP? ? ? ? ? ?指定啟動(dòng)模式為棧頂復(fù)用模式singleTop;

FLAG_ACTIVITY_NEW_TASK? ? ? ? ? ? ? 指定啟動(dòng)模式為棧內(nèi)復(fù)用模式singleTask辐脖;

FLAG_ACTIVITY_CLEAT_TOP? ? ? ? ? ? ?所有位于其上層的Activity都要移除饲宛,singleTask類似

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS? ? ?具有該標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Acitivity的列表中,即無法通過歷史列表返回到該Activity上嗜价。

兩種設(shè)置方法的區(qū)別:優(yōu)先級(jí)不同? intent>manifest設(shè)置方式? ? ? 限定范圍不同? ? ?manifest設(shè)置方式無法設(shè)定FLAG_ACTIVITY_CLEAR_TOP;Intent設(shè)置方式無法設(shè)置單例模式singleInstance艇抠;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市久锥,隨后出現(xiàn)的幾起案子家淤,更是在濱河造成了極大的恐慌,老刑警劉巖瑟由,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件絮重,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡错妖,警方通過查閱死者的電腦和手機(jī)绿鸣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暂氯,“玉大人,你說我怎么就攤上這事亮蛔〕帐” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵究流,是天一觀的道長辣吃。 經(jīng)常有香客問我,道長芬探,這世上最難降的妖魔是什么神得? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮偷仿,結(jié)果婚禮上哩簿,老公的妹妹穿的比我還像新娘宵蕉。我一直安慰自己,他們只是感情好节榜,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布羡玛。 她就那樣靜靜地躺著,像睡著了一般宗苍。 火紅的嫁衣襯著肌膚如雪稼稿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天讳窟,我揣著相機(jī)與錄音让歼,去河邊找鬼。 笑死丽啡,一個(gè)胖子當(dāng)著我的面吹牛是越,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碌上,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼倚评,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了馏予?” 一聲冷哼從身側(cè)響起天梧,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霞丧,沒想到半個(gè)月后呢岗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛹尝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年后豫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突那。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挫酿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愕难,到底是詐尸還是另有隱情早龟,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布猫缭,位于F島的核電站葱弟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猜丹。R本人自食惡果不足惜芝加,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望射窒。 院中可真熱鬧藏杖,春花似錦将塑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祥楣,卻和暖如春开财,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背误褪。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工责鳍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兽间。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓历葛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘀略。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恤溶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容