初始Activity啓動模式

       以前斷斷續續接觸瞭解過Android activity,但是從沒有應用過,此次由於一個嚴重缺陷再次認識Activity的啓動模式,相比之前理解更深刻了,之後使用檢查也就更方便了。.net

任務棧(Task Stack)

在Android中是使用任務(Task)來管理Activity的,任務就是存放在棧裏面的Activity的集合,這個棧就是稱爲任務棧。blog

 

啓動模式

Activity有4種啓動模式:standard、singleTop、singleTask、singleInstance。內存

  • standard:標準模式,這是系統默認的默認,也就是說你不設置Activity的launchMode時,默認的就是standard。在這種模式下,每次啓動一個Activity都會從新建立一個新的實例,無論這個實例是否存在。在這種模式下,誰啓動了這個Activity,那麼這個Activity就運行在啓動它的那個Activity所在的棧,可是這是有條件的,前提是啓動它的Activity不能是singleInstance,由於singleInstance只能獨立於一個任務棧中,不能有其餘的Activity實例。好比非singleInstance模式的Activity A啓動了標準模式的Activity B,那麼Activity B就會進入到Activity A所在的任務棧。
  • singleTop:棧頂複用模式。在這種模式下,若是Activity已經在任務棧的棧頂了,當再次啓動同一個Activity的時候,這個Activity不會被從新建立,並且它的onNewIntent()方法會被調用,可是它的onCreate()、onStart()方法不會被調用。此模式下的Activity也會進入啓動它的非singleInstance模式的Activity所在的任務棧中。
  • singleTask:棧內複用模式。在這種模式下,只要Activity存在棧內,那麼屢次啓動這個Activity都不會從新建立實例,系統會調用它的onNewIntent()方法。此外有個須要注意的地方:singleTask有clear top的效果,也就是說會將其以上的Activity所有出棧。
  • singleInstance:這是singleTask的一種增強模式,除了singleTask全部特性之外,具備此模式的Activity只能單獨位於一個任務棧中。

定義啓動模式

使用manifest文件,在manifest文件中聲明一個Activity的時候,能夠指定這個Activity在啓動的時候該如何與任務進行關聯。it

我的中心菜單一開始設置的啓動模式是singleTop,用戶在我的中心中點擊消息icon,費用查詢等菜單來回跳轉,多跳轉幾回平板就遇到OOM,內存不足。本質緣由就是:啓動模式是singleTop致使頁面無限堆疊,形成oom,後續改爲singleTask就不存在此問題了,任什麼時候候任何activity只建立一次,不會屢次。方法

總結

後續遇到菜單間跳轉的,就能夠先從啓動模式查起,看下是否存在內存問題,從而作相應的處理。im

圖解能夠參考連接:https://blog.csdn.net/lucky_yan99/article/details/65627952總結

相關文章
相關標籤/搜索