Activity啟動模式(launchMode)詳解
Activity的啟動模式有四種,standard、singleTop、singleTask、singleInstance.
1.standard
standard是Activity默認的啟動模式,在不進行顯示指定的情況下,所有活動都會自動使用這種啟動模式。
每次啟動都一個新的Activity位于棧頂。
android:launchMode="standard",此時每次點擊按鈕都會創建新的Activity
現在,我們寫一個簡單的按鈕 ,實現跳轉Activity
- private Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.e("MainActivity",this.toString());
- button = (Button)findViewById(R.id.button);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- Intent intent = new Intent(MainActivity.this, MainActivity.class);
- startActivity(intent);
- }
- });
- }
雖然跳轉的頁面相同,但是在Task中每點一次按鈕就會創建一個新的Activity
Activity創建日志
啟動示例圖
2.singleTop
當Activity的啟動模式為singleTop時,當啟動的Activity已經處于Activity棧頂時,則直接使用。
android:launchMode="singleTop"
我們創建NextActivity,并且在MainActivity中添加button2
- private Button button1,button2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.e("MainActivity", this.toString());
- button1 = (Button) findViewById(R.id.button1);
- button2 = (Button) findViewById(R.id.button2);
- button1.setOnClickListener(this);
- button2.setOnClickListener(this);
- }
- @Override
- public void onClick(View view) {
- switch (view.getId()){
- case R.id.button1:
- Intent intent = new Intent(MainActivity.this, MainActivity.class);
- startActivity(intent);
- break;
- case R.id.button2:
- Intent intent2 = new Intent(this, NextActivity.class);
- startActivity(intent2);
- break;
- }
- }
此時在MainActivity中啟動MainActivity,則Activity棧中只會創建一次;但是先啟動NextActivity之后再啟動MainActivity,則會創建新的MainActivity,因為此時的Activity棧頂是NextActivity
MainActivity ->MainActivity ->MainActivity
MainActivity -> NextActivity -> MainActivity
啟動示例圖
3.singleTask
當活動的啟動模式為singleTask時,啟動該Activity會現在棧中檢查是否已存在,若存在則直接將該活動之上的Activity全部出棧。
android:launchMode="singleTask"
啟動示例圖
4.singleInstance
singleInstance模式下會有一個單獨的返回棧來管理活動。不管哪個應用程序來訪問該活動,都共用同一個棧,這樣就可以允許其他程序調用,實現共享該活動。
android:launchMode="singleInstance"
啟動示例圖
圖中啟動的過程是:Main -> New -> Next 這個過程很容易看懂
返回過程是:Next -> Main -> New
明顯看出順序不一樣,為什么會出現這種情況呢?
NextActivity和MainActivity處于同一個棧,當我們返回時,NextActivity出棧,此時棧A中還存在MainActivity,并且處于棧頂,所以會看到MainActivity.
當MainActivity執行返回時,棧A會清空,然后我們就看到了位于棧B的NewActivity。
之后NewActivity出棧,棧B也為空時,App退出。
Activity的啟動模式簡單介紹到這里, 希望對您有所幫助,有不足或者錯誤的地方請指正。
后面會每星期至少一篇跟新本系列,感興趣可以關注。
一起學習,一起進步。