Android有四種啓動模式:standard、singleTop、singleTask、singleInstance。
1、standard(拿來主義)
Android默認啓動模式,每次啓動一個Activity都會創建一個新的實例,無論這個實例是否已經存在,然後將該實例加入到啓動他的任務棧中,會走Acitivity的各個生命週期,是一種典型的多實例實現。注意:當用ApplicationContext啓動一個standard模式的Acitivity時會報錯,
Android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
Is this really what you want?
這是因爲ApplicationContext是一個非Acitivity類型的Context,它沒有所謂的任務棧,相當於沒有指定它沒有任務棧可以放,你需要爲待啓動的Acitvity指定<pre name="code" class="java">FLAG_ACTIVITY_NEW_TASK標記位,這樣的話相當於創建了另一個新的任務棧,也就相當與另一種啓動模式——singleTask了
2、singleTop(相鄰和並)
即棧頂複用模式。Acitivity啓動時如果該Activity已經位於任務棧的棧頂,那麼不會重新創建新的實例,同時會回調它的onNewIntent方法,通過這個方法的參數我們可以取出當前請求的信息。當然了,不會走onCreate和onStart方法。如果新的Activity的實例已經存在但不位於棧頂,那麼新Activity仍會重新創建。
3、singleTask(唯我獨尊)
即棧內複用模式、單實例模式。只要Activity在一個棧中存在,那麼多次啓動Activity就不會再次創建Activity實例,同singleTop一樣,會回調onNewIntent方法。
4、singleInstance(獨居主義)
單實例模式,加強版singleTask,加強點爲此種模式的Activity只能單獨地位於一個任務棧中,即當啓動singleInstance模式的Acitivity時,系統會爲它創建一個新的任務棧,然後它獨自在這個新的任務棧中由於站內複用的特性,後續的請求均不會創建新的Activity,除非這個獨特的任務棧被銷燬了。
設置啓動模式有兩種:
1、AndroidMenifest.xml中:android:launchMode="singleTask"
2、intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
區別:第二種優先級高於第一種;第一種無法爲Activity設定FLAG_ACTIVITY_CLEAR_TOP,第二種無法爲Activity指定singleInstance模式。