看了標題也許你會想,也許你會說,activity我天天用,我最了解不過了,沒有什么是我不清楚的。你怕是在唬我吧?那下面就看看我說的這些你都了解嘛
基礎(chǔ)知識
-
正常情況下的生命周期
onCreate:表示Activity正在被創(chuàng)建,我們可以做一些初始化工作,沒啥子可說的。
onRestart:當(dāng)當(dāng)前Activity從不可見重新變?yōu)榭梢姞顟B(tài)時,該方法會被調(diào)用。
onStart:這時Activity已經(jīng)可見的,但是處于后臺,無法和用戶交互。
onResume:這時Activity已經(jīng)可見的,但是處于前臺。
onPause:在這個方法可以做一些存儲數(shù)據(jù),停止動畫的操作,但是不能太耗時,因為這會影響到新Activity的顯示,onPause必須執(zhí)行完,新Activity的onResume才會執(zhí)行。
onStop:Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時。
onDestory:表示Activity即將銷毀,我們可以做一些回收工作和資源釋放工作。
Activity第一次啟動會調(diào)用onCreate-->onStart-->onResume,當(dāng)用戶打開新的Activity或者切換到桌面的時候,會調(diào)用onPause-->onStop,如果這個Activity采用透明主題,不會調(diào)用onStop,是因為新Activity透明主題我們還能看到下面那個之前Activity,所以不會調(diào)用onStop,再回到原Activity時調(diào)用onRestart-->onStart-->onResume.
-
異常情況下的生命周期
資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Avtivity被殺死并重新創(chuàng)建
資源不足時導(dǎo)致優(yōu)先級低的Activity被殺死
...
Activity會調(diào)用onSaveInstanceState方法,系統(tǒng)自動為我們做了一定的恢復(fù)工作,并且重啟為我們恢復(fù)這些數(shù)據(jù),比如文本框中用戶輸入的數(shù)據(jù),listView滾動位置等,具體的我們可以查看特定View的源碼。
-
Activity的啟動模式
1、使用場景
standard:當(dāng)需要每次請求都新開一個實例的時候,比如,瀏覽器開多個瀏覽窗口。
singleTop:適合作為接受通知的啟動界面,比如,客戶端收到10條推送,如果是標準模式,分別點擊這10個推送,就會啟動10個這樣的顯示內(nèi)容的界面,而如果是singleTop,則只會打開一個顯示界面。
singleTask:適合作為程序的入口,不管其他程序打開該界面多少次,都只會在任務(wù)棧中存在一份,比如瀏覽器的啟動界面。
singleInstance:適合永遠都不會變化的界面,比如鬧鐘的提醒界面,在比如撥號程序的呼叫界面。
2、它們主要有如下不同:
- 如何決定所屬task
“standard”和”singleTop”的activity的目標task,和收到的Intent的發(fā)送者在同一個task內(nèi),除非intent包括參數(shù)FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK參數(shù),會啟動到別的task里。
“singleTask”和”singleInstance”總是把activity作為一個task的根元素,他們不會被啟動到一個其他task里。 - 是否允許多個實例
“standard”和”singleTop”可以被實例化多次,并且存在于不同的task中,且一個task可以包括一個activity的多個實例;
“singleTask”和”singleInstance”則限制只生成一個實例,并且是task的根元素。 singleTop要求如果創(chuàng)建intent的時候棧頂已經(jīng)有要創(chuàng)建 的Activity的實例,則將intent發(fā)送給該實例,而不發(fā)送給新的實例。 - 是否允許其它activity存在于本task內(nèi)
“singleInstance”獨占一個task,其它activity不能存在那個task里;如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行(如同加了FLAG_ACTIVITY_NEW_TASK參數(shù))。
而另外三種模式,則可以和其它activity共存。 - 是否每次都生成新實例
“standard”對于沒一個啟動Intent都會生成一個activity的新實例;
“singleTop”的activity如果在task的棧頂?shù)脑?,則不生成新的該activity的實例,直接使用棧頂?shù)膶嵗駝t,生成該activity的實例。
比如現(xiàn)在task棧元素為A-B-C-D(D在棧頂),這時候給D發(fā)一個啟動intent,如果D是 “standard”的,則生成D的一個新實例,棧變?yōu)锳-B-C-D-D。
如果D是singleTop的話,則不會生產(chǎn)D的新實例,棧狀態(tài)仍為A-B-C-D
如果這時候給B發(fā)Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會生成B的新實例,棧狀態(tài)變?yōu)锳-B-C-D-B。
“singleInstance”是其所在棧的唯一activity,它會每次都被重用。
“singleTask”如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前臺。
當(dāng)已經(jīng)存在的activity實例處理新的intent時候,會調(diào)用onNewIntent()方法 如果收到intent生成一個activity實例,那么用戶可以通過back鍵回到上一個狀態(tài);如果是已經(jīng)存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態(tài)。
2、IntentFilter的匹配規(guī)則
- action的匹配規(guī)則:要求Intent中的action存在且必須和過濾規(guī)則中的其中一個action相同,這個區(qū)分大小寫,如果相同的字符串,大小寫字母不同,action會匹配失敗。
- category匹配規(guī)則:這個可有可無,如果有,則必須和過濾規(guī)則中的其中一個category相同,如果不寫的話,在啟動Activity時系統(tǒng)會自動加上"android.intent.category.DEFAULT"
- data可進一步分為uri(由scheme、host、port、path | pathPattern | pathPrefix這4部分組成)和mimetype。Intent的uri可通過setData方法設(shè)置,mimetype可通過setType方法設(shè)置。隱式Intent也必須指定data。同action類似,只要Intent的data只要與Intent Filter中的任一個data聲明完全相同,data方面就匹配成功。需要注意的是:若Intent Filter的data聲明部分未指定uri,則缺省uri為content或file,Intent中的uri的scheme部分需為content或file才能匹配;若要為Intent指定完整的data,必須用setDataAndType方法,原因請看setData和setType方法的源碼:
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}
從以上代碼可以看到,setData會把mimeType置為null,setType會把uri置為null。下面我們來舉例說明一下data的匹配。首先我們先來看一下Intent Filter中指定data的語法:
<data android:scheme="...“
android:host="..."
android:port="..."
android:path="..."
android:pathPattern="..."
android:pathPrefix="..."
android:mimeType="..." />
其中scheme、host等各個部分無需全部指定。假如我們?yōu)镸yActivity的Intent Filter指定了如下data:
<intent-filter>
<data android:mimeType="vidoe/mpeg" android:scheme="http" android:host="www.xxx.com" />
<data android:mimeType="text/plain" android:scheme="http" />
</intent-filter>
那么我們的Intent想要匹配,mimeType可以為”text/plain"或“video/mpeg",scheme必須為”http“,host則沒有限制,因為第二個data沒有指定host。
最后
這就是我知道的關(guān)于activity的一些知識,若有敘述不清晰或是不準確的地方希望大家指出,如果你知道更多知識,歡迎給我評論,大家一起學(xué)習(xí)進步。謝謝觀看