Activity的四種啟動模式和onNewIntent()


Activity啟動模式詳解

在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。

Android總Activity的啟動模式分為四種:

1 Standard模式

Standard模式是Android的默認啟動模式,你不在配置文件中做任何設置,那么這個Activity就是standard模式,這種模式下,Activity可以有多個實例,每次啟動Activity,無論任務棧中是否已經有這個Activity的實例,系統都會創建一個新的Activity實例,以下是實驗驗證。

2 SingleTop模式

SingleTop模式和standard模式非常相似,主要區別就是當一個singleTop模式的Activity已經位於任務棧的棧頂,再去啟動它時,不會再創建新的實例,如果不位於棧頂,就會創建新的實例,現在把配置文件中FirstActivity的啟動模式改為SingleTop,我們的應用只有一個Activity,FirstActivity自然處於任務棧的棧頂。

3 SingleTask模式

         SingleTask模式的Activity在同一個Task內只有一個實例,如果Activity已經位於棧頂,系統不會創建新的Activity實例,和singleTop模式一樣。但Activity已經存在但不位於棧頂時,系統就會把該Activity移到棧頂,並把它上面的activity出棧。

4 SingleInstance模式

singleInstance模式也是單例的,但和singleTask不同,singleTask只是任務棧內單例,系統里是可以有多個singleTask Activity實例的,而singleInstance Activity在整個系統里只有一個實例,啟動一singleInstanceActivity時,系統會創建一個新的任務棧,並且這個任務棧只有他一個Activity。

SingleInstance模式並不常用,如果我們把一個Activity設置為singleInstance模式,你會發現它啟動時會慢一些,切換效果不好,影響用戶體驗。它往往用於多個應用之間,例如一個電視launcher里的Activity,通過遙控器某個鍵在任何情況可以啟動,這個Activity就可以設置為singleInstance模式,當在某應用中按鍵啟動這個Activity,處理完后按返回鍵,就會回到之前啟動它的應用,不影響用戶體驗。

onNewIntent(Intent intent)方法

當我們在activity的啟動模式中設置為棧內唯一時,也就是android:launchMode=”singleTask”或android:launchMode=”signleTop”時,會用到這個方法。

比如說在一個應用中A activity 跳轉至 B activity 在跳轉至 C activity 然后C做了一定的操作之后再返回A 界面。這樣在A activity的啟動模式設置為singleTask后。C界面跳轉至A界面時,就會去判斷棧內是否有改Activity實例,如果有就直接執行A界面的onNewIntent()方法,我們就可以把邏輯處理放在改生命周期方法中,如果沒有就會走Activity的oncrate方法去創建實例。

在比如說我們做了一個應用。沒個界面都有一個返回至主界面操作的按鈕。這樣的話我們就給主界面的啟動模式設置為android:launchMode=”singleTask”。當用戶在任何界面點擊返回至主界面的按鈕時,就正常的使用Intent去跳轉。只不過在棧內存在主界面的實例時,不會執行onCrate()方法而是執行的onNewIntent()方法。這時我們就把操作邏輯放在此處。

需要注意的是,在onCrate()方法中最好也寫一份操作邏輯,因為當系統內存不足時,我們的主界面實例已經被系統回收了,還是會去執行onCrate()方法的。

大家遇到一個應用的Activity供多種方式調用啟動的情況,多個調用希望只有一個Activity的實例存在,這就需要Activity的onNewIntent(Intent intent)方法了。只要在Activity中加入自己的onNewIntent(intent)的實現加上Manifest中對Activity設置lanuchMode=“singleTask”就可以。

       onNewIntent()非常好用,Activity第一啟動的時候執行onCreate()---->onStart()---->onResume()等后續生命周期函數,也就時說第一次啟動Activity並不會執行到onNewIntent(). 而后面如果再有想啟動Activity的時候,那就是執行onNewIntent()---->onResart()------>onStart()----->onResume().  如果android系統由於內存不足把已存在Activity釋放掉了,那么再次調用的時候會重新啟動Activity即執行onCreate()---->onStart()---->onResume()等。

     當調用到onNewIntent(intent)的時候,需要在onNewIntent() 中使用setIntent(intent)賦值給Activity的Intent.否則,后續的getIntent()都是得到老的Intent。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM