Android Activity Lanchemode

    Android管理activity應用棧的模式,app的入口activity爲棧的第一個元素,然後每打開一個activity,系統就把這個activity壓入棧中。當前的acitity都處於棧頂。棧遵守先進後出的原則。 這都是默認的設置模式。有些情況下要求自己定義activity的存儲方式。

  

   android自己定義activity啓動方式有兩種方式,一種是在manifest中聲明activity的時候設置activity的屬性,android:launchMode="",

或者用intent的方式聲明即將啓動的activity應用哪種啓動方式。

  在manifest中設置activity的屬性,有四種方式,Standard , SingleTop, SingleTask, SingleInstance.

  Standard模式,是android的默認模式,此類activity啓動時,會將實例放入啓動它的activity的task中。並且處於喚起他的activity的上面。這樣的activity可以多次實例化。比如這個activity自己啓動自己,那麼系統將會重新實例化一個。這樣棧中就有連續兩個這樣的activity實例。

 

  Singletop模式,這類activity是指當此activity處於棧頂時,再調用它,它不會重新實例化一個實例,而是通過 onnewIntent()函數進入已經實例化的activity中。這類activity也可以多次實例化的,並且可以在不同的task中實例化。只有它處於棧頂時候啓動它纔不會實例化。加入它沒在棧頂,你去啓動它,他還是會實例化。

 

  SingleTask模式,這類activity啓動時系統會創建一個新的task,這個activity會作爲task的第一個元素保存。這類activity在一個task中只能實例化一次。當task中含有這樣的activity時,啓動它時會通過onnewintent()函數進入這個實例,但是注意如果這時候在這個task中還有其他activity實例,在singletask  activity之上的activity都會被釋放清空。

 

  SingleInstance模式,這類activity同singletask很相似,但是它啓動時創建一個新的 task並且這個task只有這個activity實例。所以無論哪個activity被它喚起,都會處於一個新的task。

 

   例如有activity  a,b,c,d.  a是app的主activity使用singletask模式。 其中b是默認模式,c是singletop模式,d是默認模式,e是默認模式,a啓動b之後,這個時候task中的任務是 a->b, 這個時候b再啓動自己,系統還是會實例化一個b,此時task的情況是a->b->b.如果再多次啓動b仍然會實例化很多b。這個時候b再啓動c。task情況 a->b->b->c, 這個時候c啓動自己。它不會再次實例化,會調用nonewintent函數。這個時候task仍然是a->b->b->c. 這個時候再次啓動d。task爲a->b->b->c-d。 如果d再次啓動c。這個時候就會開始實例化一個c,因爲c並不是處於棧頂。 所以這個時候task爲 a->b->b->c->d->c. 如果這個時候c再次啓動a。系統不會實例化a。而是會從a中的onnewintent進入a。並且a上面的activity都會被釋放。釋放順序是從下到上。比如此例中會依次調用b->b->c->d中的ondestroy,因爲棧頂的c還處於前端暫時不會調用它的ondestroy,先去調用a中nonewintent()。等a處於前端了纔會再調用c的ondestroy。這是activity的生命週期中確定的。平時應用時要注意,這裏有一個時間差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章