Activity啓動模式及應用

1、Activity四種啓動模式

這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

2、Activity重要的啓動標識

經過代碼實現啓動模式。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棧與task棧之間的關係

假若有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

4、taskAffinity屬性

<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

5、應用場景

LoginActivity->HomeActivity->ActivityA->ActivityB
假設從登錄頁面(登陸後頁面finish),跳轉到主頁面,再跳轉到ActivityA,再跳轉到ActivityB。若是在ActivityB發現登錄過時,須要從新登陸,而且登錄後須要從新進入主頁面(至關於所有從新啓動一遍)。
方案一:能夠把HomeActivity設置爲singleTask。
方案二:可使用Intent.FLAG_ACTIVITY_CLEAR_TASK。
方案三:可使用Intent.FLAG_ACTIVITY_CLEAR_TOP。登錄

相關文章
相關標籤/搜索