Activity的啓動模式有四種:
- standard
- singleTop
- singleTask
- singleInstance
1、standard:標準模式
標準模式下,只要啓動一次Activity,系統就會在當前任務棧新建一個實例
使用場景:
正常的去打開一個新的頁面,這種啓動模式使用最多,最普通
2、singleTop:棧頂複用模式
1、當前棧中已有該Activity的實例並且該實例位於棧頂時,不會創建實例,而是複用棧頂的實例,並且會將Intent對象傳入,回調onNewIntent()方法;
2、當前棧中已有該Activity的實例但是該實例不在棧頂時,其行爲和standard啓動模式一樣,依然會創建一個新的實例;
3、當前棧中不存在該Activity的實例時,其行爲同standard啓動模式。
應用場景:
假如一個新聞客戶端,在通知欄收到了3條推送,點擊每一條推送會打開新聞的詳情頁,如果爲默認的啓動模式的話,點擊一次打開一個頁面,會打開三個詳情頁,這肯定是不合理的。如果啓動模式設置爲singleTop,當點擊第一條推送後,新聞詳情頁已經處於棧頂,當我們第二條和第三條推送的時候,只需要通過Intent傳入相應的內容即可,並不會重新打開新的頁面,這樣就可以避免重複打開頁面了
3、singleTask:站內複用模式
在複用的時候,首先會根據taskAffinity去找對應的任務棧:
1、如果不存在指定的任務棧,系統會新建對應的任務棧,並新建Activity實例壓入棧中。
2、如果存在指定的任務棧,則會查找該任務棧中是否存在該Activity實例
a、如果不存在該實例,則會在該任務棧中新建Activity實例。
b、如果存在該實例,則會直接引用,並且回調該實例的onNewIntent()方法。並且任務棧中該實例之上的Activity會被全部銷燬。
使用場景:
SingleTask這種啓動模式最常使用的就是一個APP的首頁,因爲一般爲一個APP的第一個頁面,且長時間保留在棧中,所以最適合設置singleTask啓動模式來複用
4、singleInstance:單實例模式
啓動該模式Activity的時候,會查找系統中是否存在:
1、不存在,首先會新建一個任務棧,其次創建該Activity實例。
2、存在,則會直接引用該實例,並且回調onNewIntent()方法。
特殊情況:該任務棧或該實例被銷燬,系統會重新創建。
使用場景:
很常見的是,電話撥號盤頁面,通過自己的應用或者其他應用打開撥打電話頁面 ,只要系統的棧中存在該實例,那麼就會直接調用