1. 程式人生 > >Android學習之路 Activity的四種載入模式

Android學習之路 Activity的四種載入模式

在瞭解Activiry的四種載入模式之前,先得對棧有一定得理解,在這裡不再花篇幅去介紹棧。首先介紹下為何要制定載入模式

一:為什麼要為Activity指定載入模式

Android用Task來管理Activity棧,每建立一個Activity就會新建一個TASK棧或者新增到現有得Task棧中。這取決於你要以何種方式來管理Activity,這裡就不得不引用載入模式了

二:Activity得四種載入模式

standard:  標準模式,也是預設模式

singleTop: Task棧頂單例模式

singleTask:Task棧內單例模式

singleInstance:全域性單例模式

(1)standard:預設模式

這種模式只會有一個Task棧,並且這個Task棧會在建立第一個Activity得建立,之後建立的每一個Activity都會新增到Task棧中(即使這個新建的Activity與當前Activity一摸一樣),

舉個例子:

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隨便定義一個xml佈局檔案,該佈局檔案包含一個Button部件用於測試
        setContentView(R.layout.text_layout);
        btn = (Button) findViewById(R.id.btn);
        System.out.println("Activity is :"+this.toString()
         + "  TaskID is :"+this.getTaskId());

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                //啟動自己
                intent.setClass(MainActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

啟動該程式,點選按鈕,可以發現輸出的TaskID總是相同的,載入效果如下圖所示


(2):singleTop模式

與Standard模式基本相似,但是有一點不一樣:當要啟動的Activity已經位於棧頂的時候,不會再重新建立該Activity例項

(3):singleTask模式

一個Activity有且最多隻有一個例項。在同一個應用程式中啟動他的時候,若Activity不存在,則會在當前task建立一個新的例項,若存在,則會把task中在其之上的其它Activity destory掉並呼叫它的onNewIntent方法。

如果是在別的應用程式中啟動它,則會新建一個task,並在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的例項中再開啟新的Activity,這個新的Activity還是會在singleTask的例項的task中。

所以應用分為三種情況:

1,建立的Activity不存在,系統會建立Activity的例項放入棧頂

2,Activity存在且位於棧頂,系統不會做處理

3,Activity存在且不在棧頂,這個時候系統會清除位於該Activity上面的所有Activity例項,並將該Activity置於棧頂

(4):singleInstance模式

只有一個例項,並且這個例項獨立執行在一個task中,這個task只有這個例項,不允許有別的Activity存在。

應用情況:

1,該Activity不存在,則系統會為該Activity新建一個Task,並將該Activity置於棧頂,並且該Task不會再新增其它Activity例項

2,該Activity已經存在,系統會把該Activity所在的Task轉到前臺,讓該Activity顯示

三:Activity的具體載入方法

前面描述了所有的載入模式,但卻沒有告訴我們如何去設定Activity的載入模式

這裡舉例有一個Activity為ActivityA,需要將其設定為standard載入模式,則程式碼為:

 <activity android:name=".ActivityA"
            android:launchMode="standard"/>