Android Activity的四大啟動模式詳解
在Android中每個介面都是一個Activity,切換介面操作其實是多個不同Activity之間的例項化操作。在Android中Activity的啟動模式決定了Activity的啟動執行方式。
Android總Activity的啟動模式分為四種:
Activity啟動模式設定:
<activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啟動模式:
1. standard
模式啟動模式,每次啟用Activity時都會建立Activity,並放入任務棧中。
2. singleTop
如果在任務的棧頂正好存在該Activity的例項, 就重用該例項,否者就會建立新的例項並放入棧頂(即使棧中已經存在該Activity例項,只要不在棧頂,都會建立例項)。
3. singleTask
如果在棧中已經有該Activity的例項,就重用該例項(會呼叫例項的onNewIntent())。重用時,會讓該例項回到棧頂,因此在它上面的例項將會被移除棧。如果棧中不存在該例項,將會建立新的例項放入棧中。
4. singleInstance
在一個新棧中建立該Activity例項,並讓多個應用共享改棧中的該Activity例項。一旦改模式的Activity的例項存在於某個棧中,任何應用再啟用改Activity時都會重用該棧中的例項,其效果相當於多個應用程式共享一個應用,不管誰啟用該Activity都會進入同一個應用中。
standard
其中standard是系統預設的啟動模式。
下面通過例項來演示standard的執行機制:
private TextView text_show; private Button btn_mode; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_show = (TextView) this.findViewById(R.id.text_show); text_show.setText(this.toString()); btn_mode = (Button) this.findViewById(R.id.btn_mode); } //按鈕單擊事件 public void LaunchStandard(View v){ startActivity(new Intent(this,MainActivity.class)); text_show.setText(this.toString()); }
初始化介面如下:
當點選按鈕時,會建立新的Activity,通過TextView@後16進位制數的顯示即可看出,點選兩次分別介面如下:
此時,我們分析棧內部的執行機制:(依次從棧頂向上)
因此,這種Standard模式是每次都會建立新的Activity物件,當點選返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳 到下一層,例如如果現在Activity是44ed8c50,那麼當我們點選返回時Activity會變為44f28a48,不過此時在這個 Activity中再次點選按鈕建立物件時,它會另外建立新的Activity物件,這種模式可能大多數情況下不是我們需要的,因為對系統效能的消耗過 大。
下面我們介紹兩種能使用當前棧中Activity的啟動模式:
singleTop
從上面的解釋中即可知道,在每次使用新的Activity時會自動檢測棧頂的當前Activity是否是需要引用的Activity,如果是則直接引用此Activity,而不會建立新的Activity。
我們在剛才的介面中加入一個”啟動singletop模式”按鈕,當點選時出現我們建立的singletop中,在Activity singletop中有一個按鈕,啟動singletop模式,表示啟動當前Activity,由於我們在清單檔案中配置Activity的啟動模式為 singleTop,因此此時不會再建立而是利用當前棧頂的singleTop Activity:
<activity android:name=".SingleTopActivity" android:label="@string/singletop" android:launchMode="singleTop" > </activity>
介面初始化:
點選”啟動singleTop模式”按鈕:
我們分析它的執行機制,可知,當程式執行到此時,棧中的資料形式為:
當我們在上面介面中點選”啟動singleTop模式”按鈕時,由於此Activity設定的啟動模式為singleTop,因此它首先會 檢測當前棧頂是否為我們要請求的Activity物件,經驗證成立,因此它不會建立新的Activity,而是引用當前棧頂的Activity。
雖然它不會建立新的Activity物件,不過它每次回撥用onNewIntent()方法:
@Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); Toast.makeText(this, new Date().toString(), 1).show(); }
我們為此方法編寫程式碼輸出當前日期,則在每次點選上面按鈕時會輸出當前日期。
singleTask
此啟動模式和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求建立的,而 singleTask則會檢測棧中全部的Activity物件,從上向下,如果檢測到是我們所請求的則會消滅此Activity物件上面的物件,直接把檢 測到的我們需要的Activity置為棧頂。
我們建立一個SingleTaskActivity,此介面中包含一個啟動MainActivity和啟動SingleTaskActivity按鈕。
初始化:
點選”啟動singleTask模式”按鈕:
在此介面中點選第二個按鈕”啟動singleTask模式”按鈕,根據定義會檢測當前棧中是否有此Activity物件,因此顯示的還是當前的Activity,不會重新建立;
再點選”啟動Standard模式”按鈕,由於MainActivity的啟動模式為standard,所以在此會重新建立一個MainActivity物件:
此時棧中資料格式為:
當在上面介面中點選”啟動singleTask模式”按鈕時,由於檢測到當期棧中第二個為我們要建立的Activity,會將最上面的MainActivity消滅,然後將SingleTaskActivity設定為棧頂:
SingleInstance
此啟動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程式中訪問瀏覽器時,如果當前瀏覽器沒有開啟,則開啟瀏覽器,否則會在當前開啟的瀏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity物件在當前的棧中只存在一個。
上面即為Android中的四種啟動模式,我們在開發Android專案時會經常使用到,巧妙設定Activity的啟動模式會節省系統開銷和程式執行效率。
相關文章
- [Android]Android Activity 啟動模式詳解Android模式
- Activity的啟動模式詳解模式
- Android Activity的生命週期和啟動模式詳解Android模式
- android Activity的啟動模式 作用簡析+demo詳解Android模式
- Activity的生命週期和啟動模式詳解模式
- Android-Activity的啟動模式Android模式
- ActivityRecord、TaskRecord、ActivityStack以及Activity啟動模式詳解模式
- 詳解Android中的四大元件之一:Activity詳解Android元件
- Android Activity啟動模式全面解析Android模式
- activity的啟動模式模式
- Android Activity 啟動模式的功能驗證Android模式
- 重溫Android四大元件(二)—Activity的啟動模式與標誌位Android元件模式
- Activity啟動模式模式
- 擼擼Android的羊毛(一)----Activity啟動模式Android模式
- Android學習筆記-Activity的啟動模式Android筆記模式
- Android中的Activity四種啟動模式(launchMode)Android模式
- Android之Activity啟動流程詳解(基於api28)AndroidAPI
- 完全理解android Activity啟動模式LauchMode (深入Activity與任務棧)Android模式
- Android中Activity的啟動模式(LaunchMode)和使用場景Android模式
- activity四種啟動模式模式
- Android Activity的啟動過程Android
- Android面試官裝逼失敗之:Activity的啟動模式Android面試模式
- Activity啟動模式(GIF 動態演示)模式
- 詳解 Android 的 Activity 元件【Z】Android元件
- Activity的生命週期和啟動模式模式
- 幾張圖讓你明白Android四大啟動模式Android模式
- Android四大元件——Activity——Activity的生命週期Android元件
- 【Android原始碼】Activity的啟動流程Android原始碼
- Android的activity的四種啟動方式Android
- Activity生命週期與啟動模式模式
- Android 圖文教學讓你徹底理解activity啟動模式Android模式
- Android深入四大元件(六)Android8.0 根Activity啟動過程(前篇)Android元件
- Android深入四大元件(七)Android8.0 根Activity啟動過程(後篇)Android元件
- 組內技術分享-Activity 的啟動模式模式
- Android開發藝術(1)——Activity的生命週期和啟動模式Android模式
- Activity 的 "啟動流程"(基於 Android 9.0)Android
- Android中Activity的四種啟動方式Android
- 淺析Android Activity的啟動過程Android