activity的啟動(dòng)模式自然不能脫離Activity的任務(wù)棧(Task),任務(wù)棧(Task)即Application啟動(dòng)時(shí),系統(tǒng)會(huì)為Application創(chuàng)建一個(gè)任務(wù)棧(Task),我們對(duì)Activity的打開和關(guān)閉操作,就是將Activity壓入(push)任務(wù)棧和從任務(wù)棧中彈出(pop)的操作,任務(wù)棧遵循先進(jìn)后出的原則,在棧頂?shù)腁ctivity就是設(shè)備當(dāng)前顯示的Activity。下面切入正題:
1、standard:activity的默認(rèn)啟動(dòng)模式,起允許很多實(shí)例創(chuàng)建。
2、singleTop:相對(duì)于standard而言,當(dāng)有新的請(qǐng)求時(shí),只有在目標(biāo)activity處理?xiàng)m敃r(shí),才會(huì)調(diào)用方法onNewIntent(Intent intent) 而不創(chuàng)建新實(shí)例,其他情況都和standard一致。
場(chǎng)景:APP接收到多條推送消息,點(diǎn)開不同消息,均由同一實(shí)例展示。
3、singleTask:設(shè)置了singleTask啟動(dòng)模式的Activity,它在啟動(dòng)的時(shí)候,會(huì)先在系統(tǒng)中查找屬性值affinity等于它的屬性值taskAffinity的任務(wù)是否存在;如果存在這樣的任務(wù),它就會(huì)在這個(gè)任務(wù)中啟動(dòng),否則就會(huì)在新任務(wù)中啟動(dòng)。因此,如果我們想要設(shè)置了singleTask啟動(dòng)模式的Activity在新的任務(wù)中啟動(dòng),就要為它設(shè)置一個(gè)獨(dú)立的taskAffinity屬性值。如果設(shè)置了singleTask啟動(dòng)模式的Activity不是在新的任務(wù)中啟動(dòng)時(shí),它會(huì)在已有的任務(wù)中查看是否已經(jīng)存在相應(yīng)的Activity實(shí)例,如果存在,就會(huì)把位于這個(gè)Activity實(shí)例上面的Activity全部結(jié)束掉,即最終這個(gè)Activity實(shí)例會(huì)位于任務(wù)的堆棧頂端中。
場(chǎng)景:APP的主頁(yè)
4、singleInstance:和singleTask相比,不同點(diǎn)在于設(shè)置了singleInstance 的 activity所在的Task只會(huì)有這一個(gè)activity。
場(chǎng)景:如APP經(jīng)常調(diào)用的撥打電話、系統(tǒng)通訊錄、地圖類APP 等頁(yè)面,不同APP調(diào)用此類Activity 時(shí),首次創(chuàng)建實(shí)例,之后其他APP只能復(fù)用此實(shí)例。
一般而言,singleTask與singleTop都是為了保證Activity在任務(wù)棧中的唯一性。