Activity 是應(yīng)用用來(lái)和用戶交互的窗口劳较。
Activity 生命周期
- Acitivity本質(zhì)上有四種狀態(tài)
1.運(yùn)行:activity處于前臺(tái)用戶可見,可操作鸿染。(即activity位于棧頂端)
2.暫停:如果一個(gè)活動(dòng)被另一個(gè)非全屏的活動(dòng)所覆蓋(比如一個(gè)Dialog),那么該活動(dòng)就失去了焦點(diǎn),它將會(huì)暫停(但它仍然保留所有的狀態(tài)和成員信息庆寺,并且仍然是依附在WindowsManager上),在系統(tǒng)內(nèi)存積極缺乏的時(shí)候會(huì)將它殺死诉字。
3.停止:如果一個(gè)活動(dòng)被另一個(gè)全屏活動(dòng)完全覆蓋懦尝,那么該活動(dòng)處于停止?fàn)顟B(tài)(狀態(tài)和成員信息會(huì)保留,但是Activity已經(jīng)不再依附于WindowManager了)壤圃。同時(shí)陵霉,在系統(tǒng)缺乏資源的時(shí)候會(huì)將它殺死(它會(huì)比暫停狀態(tài)的活動(dòng)先殺死)。
4.重啟:如果一個(gè)活動(dòng)在處于停止或者暫停的狀態(tài)下伍绳,系統(tǒng)內(nèi)存缺乏時(shí)會(huì)將其結(jié)束(finish)或者殺死(kill)踊挠。這種非正常情況下,系統(tǒng)在殺死或者結(jié)束之前會(huì)調(diào)用onSaveInstance()方法來(lái)保存信息冲杀,同時(shí)效床,當(dāng)Activity被移動(dòng)到前臺(tái)時(shí)睹酌,重新啟動(dòng)該Activity并調(diào)用onRestoreInstance()方法加載保留的信息,以保持原有的狀態(tài)剩檀。
-
生命周期
1.onCreate:與onDestroy配對(duì)憋沿,表示Activity正在被創(chuàng)建,這是生命周期的第一個(gè)方法沪猴。在這個(gè)方法中可以做一些初始化的工作(加載布局資源辐啄、初始化Activity所需要的數(shù)據(jù)等),耗時(shí)的工作在異步線程上完成字币。
2.onRestart:表示Activity正在重新啟動(dòng)则披。一般情況下,在當(dāng)前Activity從不可見重新變?yōu)榭梢姷臓顟B(tài)時(shí)onRestart就會(huì)被調(diào)用洗出。這種情形一般是由于用戶的行為所導(dǎo)致的士复,比如用戶按下Home鍵切換到桌面或者打開了一個(gè)新的Activity(這時(shí)當(dāng)前Activity會(huì)暫停,也就是onPause和onStop被執(zhí)行)翩活,接著用戶又回到了這個(gè)Activity阱洪,就會(huì)出現(xiàn)這種情況。
3.onStart:與onStop配對(duì)菠镇,表示Activity正在被啟動(dòng)冗荸,并且即將開始。但是這個(gè)時(shí)候要注意它與onResume的區(qū)別利耍。兩者都表示Activity可見蚌本,但是onStart時(shí)Activity還正在加載其他內(nèi)容,正在向我們展示隘梨,用戶還無(wú)法看到程癌,即無(wú)法交互。
4.onResume:與onPause配對(duì)轴猎,表示Activity已經(jīng)創(chuàng)建完成陕壹,并且可以開始活動(dòng)了宛瞄,這個(gè)時(shí)候用戶已經(jīng)可以看到界面了族操,并且即將與用戶交互(完成該周期之后便可以響應(yīng)用戶的交互事件了)停忿。
5.onPause:與onResume配對(duì),表示Activity正在暫停可婶,正常情況下沿癞,onStop接著就會(huì)被調(diào)用。在特殊情況下矛渴,如果這個(gè)時(shí)候用戶快速地再回到當(dāng)前的Activity,那么onResume會(huì)被調(diào)用(極端情況)抛寝。一般來(lái)說,在這個(gè)生命周期狀態(tài)下,可以做一些存儲(chǔ)數(shù)據(jù)盗舰、停止動(dòng)畫的工作晶府,但是不能太耗時(shí),如果是由于啟動(dòng)新的Activity而喚醒的該狀態(tài)钻趋,那會(huì)影響到新Activity的顯示川陆,原因是onPause必須執(zhí)行完,新的Activity的onResume才會(huì)執(zhí)行蛮位。
6.onStop:與onStart配對(duì)较沪,表示Activity即將停止,可以做一些稍微重量級(jí)的回收工作失仁,同樣也不能太耗時(shí)(可以比onPause稍微好一點(diǎn))尸曼。
7.onDestroy:與onCreate配對(duì),表示Activity即將被銷毀萄焦,這是Activity生命周期的最后一個(gè)回調(diào)控轿,我們可以做一些回收工作和最終的資源釋放(如Service、BroadReceiver拂封、Map等)茬射。
Activity 實(shí)際應(yīng)用
- 正常情況下一個(gè)activity的生命周期
demo.com E/LOG: onCreate
demo.com E/LOG: onStart
demo.com E/LOG: onResume
demo.com E/LOG: onPause
demo.com E/LOG: onStop
demo.com E/LOG: onDestroy
- 非正常情況下 activity 生命周期
- 橫豎屏切換
- 默認(rèn)情況橫豎屏切換
demo.com E/LOG: onCreate
demo.com E/LOG: onStart
demo.com E/LOG: onResume
demo.com E/LOG: onPause
demo.com E/LOG: onSaveInstanceState
demo.com E/LOG: onStop
demo.com E/LOG: onDestroy
demo.com E/LOG: onCreate
demo.com E/LOG: onStart
demo.com E/LOG: onResume
- AndroidManifest.xml中加入配置
android:configChanges="orientation|keyboardHidden" [api3.2之前]
android:configChanges="orientation|keyboardHidden|screenSize" [api3.2之后] 界面方向以及大小的改變不需要重建
橫豎屏切換的時(shí)候不會(huì)創(chuàng)建新的activityapi3.2但是會(huì)調(diào)用onConfigurationChanged()方法可在里面做一些適配或者修改:
切換橫屏調(diào)用onConfigurationChanged 一次
切換豎屏調(diào)用onConfigurationChanged 一次
06-28 17:12:34.370 12514-12514/demo.com E/LOG: onCreate
06-28 17:12:34.373 12514-12514/demo.com E/LOG: onStart
06-28 17:12:34.373 12514-12514/demo.com E/LOG: onResume
06-28 17:12:36.297 12514-12514/demo.com E/LOG: onConfigurationChanged
06-28 17:12:41.526 12514-12514/demo.com E/LOG: onConfigurationChanged
Activity 啟動(dòng)模式
具體介紹 來(lái)自Carson_Ho
-
如下圖 ↓
通俗講解
-
如下圖 ↓
區(qū)別
-
如下圖
如何設(shè)置啟動(dòng)模式
通過設(shè)置ActivityManifest
<activity
android:launchMode="啟動(dòng)模式"
//屬性
//standard:標(biāo)準(zhǔn)模式
//singleTop:棧頂復(fù)用模式
//singleTask:棧內(nèi)復(fù)用模式
//singleInstance:?jiǎn)卫J?//如不設(shè)置,Activity的啟動(dòng)模式默認(rèn)為**標(biāo)準(zhǔn)模式(standard)**
</activity>
通過Intent設(shè)置標(biāo)志位
Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
標(biāo)記位屬性
標(biāo)記屬性 | 含義 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定啟動(dòng)模式為棧頂復(fù)用模式(SingleTop) |
FLAG_ACTIVITY_NEW_TASK | 指定啟動(dòng)模式為棧內(nèi)復(fù)用模式(SingleTask) |
FLAG_ACTIVITY_CLEAR_TOP | 所有位于其上層的Activity都要移除冒签,SingleTask模式默認(rèn)具有此標(biāo)記效果 |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 具有該標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Activity的列表中在抛,即無(wú)法通過歷史列表回到該Activity上 |
兩種方式的區(qū)別
- 優(yōu)先級(jí)
Intent設(shè)置方式的優(yōu)先級(jí) > Manifest設(shè)置方式 - 限定范圍不同
Manifest設(shè)置方式無(wú)法設(shè)定 FLAG_ACTIVITY_CLEAR_TOP;Intent設(shè)置方式 無(wú)法設(shè)置單例模式(SingleInstance)
Activity之間通訊
- activity之間通過intent來(lái)進(jìn)行通訊
// 在AActivity中啟動(dòng)BActivity 并傳遞參數(shù)parameter1 和parameter2 給BActivity
Intent intent = new Intent(AActivity.this, BActivity.class);
intent.putExtra("parameter1", parameter1);
intent.putExtra("parameter2", parameter2);
startActivity(intent);
// 在BActivity中獲取AActivity中傳遞過來(lái)的參數(shù)
parameter1= getIntent().getStringExtra("parameter1");
parameter2= getIntent().getStringExtra("parameter2");