Activity那些或許你不太清楚的事

看了標題也許你會想,也許你會說,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í)進步。謝謝觀看

參考資料 《Android開發(fā)藝術(shù)探索》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.什么是Activity?問的不太多,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activit...
    JoonyLee閱讀 5,858評論 2 51
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,355評論 0 17
  • Activity 一、四種形態(tài) 運行狀態(tài): 當(dāng) Activity 處于棧的頂層,可見,并可與用戶進行交互 onRe...
    任教主來也閱讀 1,887評論 1 10
  • 【 Android四大組件之一 主要用于與用戶進行交互,在一個App中可能存在零個或多個Activity 】 1....
    征程_Journey閱讀 2,068評論 0 4
  • 客中初夏 司馬光---宋代 四月清和雨乍晴,南山當(dāng)戶轉(zhuǎn)分明。 更無柳絮因風(fēng)起,惟有葵花向日傾。 譯文: 初夏四月,...
    阿喵愛讀書閱讀 386評論 1 3

友情鏈接更多精彩內(nèi)容