天天看點

Android activity四種啟動模式完全解析

android使用“任務棧”(也稱“back stack”)存放啟動的各個activity。一般情況下,一個應用隻有一個任務棧。特殊情況允許一個應用使用多個任務棧。典型的filo(first in last out)資料結構。點選“back”鍵,自上至下依次出棧結束activity。

standard

singletop

singletask

singleinstance

通過在androidmanifest.xml中節點設定android:launchmode=”standard”可以改變activity的啟動模式,預設為standard。

檢視任務棧中activity資訊的指令是:adb shell dumpsys activity activities

下面進行詳細介紹:

預設啟動模式,每次啟動都建立該activity新執行個體并放入任務棧棧頂,而且永遠不會調用activity#onnewintent()。依次打開activitya,activityb,activityc,activityd。

Android activity四種啟動模式完全解析

之後打開activityb。

Android activity四種啟動模式完全解析

若任務棧棧頂正好是要啟動的activity,則不建立新執行個體,隻是調用activity#onnewintent()。否則情景和standard效果相同。設定activityd的android:launchmode=”singletop”。依次打開activitya,activityb,activityc,activityd。

Android activity四種啟動模式完全解析

之後打開activityd。

Android activity四種啟動模式完全解析

若任務棧中有該activity的執行個體,則不建立新執行個體,隻是調用activity#onnewintent(),并且任務棧中該activity之上的所有執行個體将會被自動清除。若任務棧中沒有該activity執行個體,效果同standard模式。設定activityb的android:launchmode=”singletask”。依次打開activitya,activityb,activityc,activityd。

Android activity四種啟動模式完全解析
Android activity四種啟動模式完全解析

taskaffinity預設等于包名,如果設定過taskaffinity屬性,則此時系統會嘗試為這個activity單獨建立一個任務棧。設定activityb的android:launchmode=”singletask”,android:taskaffinity=”com.dyk.taskaffinity.activityb”。依次打開activitya,activityb,activityc,activityd,activityb。

Android activity四種啟動模式完全解析

此時taskaffinity屬性等于包名,被啟動的該activity還是使用相同的任務棧。

taskaffinity屬性一般在由其他應用程式啟動時設定

在一個新棧中建立該activity執行個體,并讓多個應用共享改棧中的該activity執行個體。一旦改模式的activity的執行個體存在于某個棧中,任何應用再激活改activity時都會重用該棧中的執行個體,其效果相當于多個應用程式共享一個應用,不管誰激活該activity都會進入同一個應用中。 設定activityb的android:launchmode=”singleinstance”。依次打開activitya,activityb,activityc,activityd。

Android activity四種啟動模式完全解析

按下back鍵依次結束activityd,activityc,activitya,activityb。

Android activity四種啟動模式完全解析

按下back鍵依次結束activityb,activityd,activityc,activitya。

activity#onnewintent()使用的奇技淫巧

onnewintent()非常好用,activity第一啟動的時候執行oncreate()—->onstart()—->onresume()等後續生命周期函數,也就時說第一次啟動activity并不會執行到onnewintent()。 而後面如果再有想啟動activity的時候,那就是執行onnewintent()—->onresart()——>onstart()—–>onresume()。如果android系統由于記憶體不足把已存在activity釋放掉了,那麼再次調用的時候會重新啟動activity即執行oncreate()—->onstart()—->onresume()等。

注:甯願少用也不濫用啟動模式,一旦因為啟動模式出現錯誤,十分難以查找。慎用!

繼續閱讀