這4種啓動模式都是經過在manifest中註冊實現的。android
<activity android:name=".DemoActivity" android:launchMode="singleTask"/>
standard模式:全部activity都在同一個task棧中。每次啓動activity,都會生成一個新的activity實例。
singleTop模式:全部activity都在同一個task棧中。啓動activity時,若是該activity實例已經存在於棧頂,則複用該activity實例;不然,生成一個新的activity實例。
singleTask模式:全部activity都在同一個task棧中。啓動activity時,若是該activity實例已經存在於棧中,則複用該activity實例,同時彈出該activity上面的全部實例;不然,生成一個新的activity實例。
singleInstance模式:會在一個新的task棧中啓動該activity實例,且這個棧中有且只能有這一個activity實例。app
經過代碼實現啓動模式。code
Intent intent = new Intent(); intent.setClass(context, DemoActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent);
Intent.FLAG_ACTIVITY_NEW_TASK:在一個新的task棧中啓動activity,可是並非必定會在一個新的task棧中啓動activity。若是系統爲該activity找到一個極具親和力(taskAffinity的值相等)的task棧,就不會在新的task棧中啓動Activity。
Intent.FLAG_ACTIVITY_CLEAR_TOP:清空當前task棧中,該activity之上的全部activity實例,當前activity是否會從新onCreate,取決因而否與Intent.FLAG_ACTIVITY_SINGLE_TOP標記連用。
Intent.FLAG_ACTIVITY_SINGLE_TOP:只用Intent.FLAG_ACTIVITY_CLEAR_TOP當前Activity會從新onCreate,Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP組合使用,當前Activity不會從新onCreate。
Intent.FLAG_ACTIVITY_CLEAR_TASK:清空當前task棧中,全部activity實例。
Intent.FLAG_ACTIVITY_CLEAR_TASK+Intent.FLAG_ACTIVITY_NEW_TASK聯合使用:清空當前task棧。而後在一個新的task棧中啓動activity,可是並非必定會在一個新的task棧中啓動activity。若是系統爲該activity找到一個極具親和力(taskAffinity的值相等)的task棧,就不會在新的task棧中啓動Activity。
Intent.FLAG_ACTIVITY_CLEAR_TOP+Intent.FLAG_ACTIVITY_NEW_TASK聯合使用:清空當前task棧中,該activity之上的全部activity實例。而後在一個新的task棧中啓動activity,可是並非必定會在一個新的task棧中啓動activity。若是系統爲該activity找到一個極具親和力(taskAffinity的值相等)的task棧,就不會在新的task棧中啓動Activity。it
假若有3個task棧,task1中包含activity1,task2中包含activity2,task3中包含activity3和activity4,假如task一、task二、task3的位置關係是,task3位於頂部。
只有最上層task棧中的activity有啓動別的activity的權限:上述例子中,activity3和activity4能夠啓動別的activity,activity1和activity2沒法啓動別的activity。
頂層activity所在棧必定位於頂部:上述例子中,假如activity3啓動了activity1,那麼task1將被提到頂部。activity1能夠啓動別的activity,activity二、activity3和activity4沒法啓動別的activity。io
<activity android:name=".DemoActivity" android:taskAffinity="123456" android:allowTaskReparenting="true"/>
taskAffinity用於標記當前activity應該屬於哪一個task棧:若是activity沒有指定taskAffinity的值,那麼就等於application的taskAffinity的值,若是application也沒有指定,那麼taskAffinity的值就等於包名。
默認狀況下,Intent.FLAG_ACTIVITY_NEW_TASK不會在新的task棧中啓動activity:由於能找到一個極具親和力的task棧,默認狀況下,activity的taskAffinity值都等於包名。
activity從新宿主:若是application1的activity1與application2的activity2的taskAffinity值相等,且application1的activity1的allowTaskReparenting設置爲true。啓動activity1後退到後臺,再啓動activity2時,activity1會從新宿主,也就是說會先看到activity1。class
LoginActivity->HomeActivity->ActivityA->ActivityB
假設從登錄頁面(登陸後頁面finish),跳轉到主頁面,再跳轉到ActivityA,再跳轉到ActivityB。若是在ActivityB發現登錄過時,須要從新登陸,而且登錄後須要從新進入主頁面(至關於所有從新啓動一遍)。
方案一:能夠把HomeActivity設置爲singleTask。
方案二:可使用Intent.FLAG_ACTIVITY_CLEAR_TASK。
方案三:可使用Intent.FLAG_ACTIVITY_CLEAR_TOP。登錄