啟動模式簡介:
*standard:標准模式,也是默認的加載模式。
*singleTop:Task棧頂單例模式。
*singleTask:Task內單例模式。
*singleInstance:全局單例模式。
一、standard模式啟動:
通過standard模式啟動時,系統總會為目標Activity創建一個新的實例,並將該Activity添加到當前Task棧中——這種啟動模式不會啟動新的Task,新Activity將被添加到原來的Task棧中。
示例:
創建一個Activity,用standard模式重復加載該Activity,可以看到,Task的Id是不變的——表明這種加載模式不會使用新的Task,而是使用同一個Task棧。當我們按返回鍵時,系統將會“逐一”從Activity棧頂刪除Activity。
public class StandardStartActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll=new LinearLayout(StandardStartActivity.this);
ll.setOrientation(LinearLayout.VERTICAL);
this.setContentView(ll);
//這個TextView 用於顯示Activity和Task ID
TextView textView=new TextView(StandardStartActivity.this);
textView.setText("Activity是:"+this.toString()+"\n"+",task Id是:"+this.getTaskId());
//設置一個按鈕啟動MainActivity
Button button=new Button(StandardStartActivity.this);
button.setText("啟動MainActivity");
//添加TextView和Button
ll.addView(textView);
ll.addView(button);
//為按鈕設置監聽
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(StandardStartActivity.this,StandardStartActivity.class);
startActivity(intent);
}
});
}
}
二、singleTop模式啟動:
這種模式與standard模式相似,但有一點不同:當將要啟動的目標Activity已經位於Task棧頂時,系統不會重新創建目標Activity的實例,而是直接復用已有的Activity實例。如果將要啟動的目標Activity沒有位於棧頂,此時系統就會重新創建目標Activity的實例。
三、singleTask()模式:
這種加載模式的Activity在同一個Task內只有一個實例,采用這種模式啟動目標Activity時,可分為如下三種情況:
*如果將要啟動的目標Activity不存在你,系統將會創建目標Activity的實例,並將它加入Task棧頂。
*如果將要啟動的目標Activity已經位於棧頂,此時與singleTop模式的行為相同。
*如果將要啟動的目標Activity已經存在,但是沒有位於Task棧頂,系統將會把位於該Activity上面的所有Activity移除Task棧,從而使得目標Activity轉入棧頂。
示例:
創建一個Activity,此Activity設為應用入口Activity,以默認模式啟動。並在此Activity中設置一個按鈕,用於跳轉到另外一個以singleTask模式啟動的Activity
public class SingleTaskModleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout=new LinearLayout(SingleTaskModleActivity.this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
this.setContentView(linearLayout);
TextView textView=new TextView(SingleTaskModleActivity.this);
textView.setText("Activity是:"+this.toString()+"\n"+",task Id是:"+this.getTaskId());
Button button=new Button(SingleTaskModleActivity.this);
button.setText("啟動Onother_Activity");
linearLayout.addView(textView);
linearLayout.addView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(SingleTaskModleActivity.this,OnotherActivity.class);
startActivity(intent);
}
});
}
}
創建另一個Activity,並以singleTask模式啟動,(即在AndroidManiFest.xml中配置<activity
android:launchMode="singleTask"
>這個屬性)在此Activity中也設置一個按鈕,用於控制跳轉到SingleTaskModleActivity
public class OnotherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout=new LinearLayout(OnotherActivity.this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
this.setContentView(linearLayout);
TextView textView=new TextView(OnotherActivity.this);
textView.setText("Activity是:"+this.toString()+"\n"+",task Id是:"+this.getTaskId());
Button button=new Button(OnotherActivity.this);
button.setText("啟動SingleTaskModle_Activity");
linearLayout.addView(textView);
linearLayout.addView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(OnotherActivity.this,SingleTaskModle.class);
startActivity(intent);
}
});
}
}
(1) 當我們運行程序,進入SingleTaskModleActivity第一次點擊按鈕“啟動Onother_Activity”,此時會跳轉到OnotherActivity,
OnotherActivity會以singleTask模式啟動:OnotherActivity不存在,所以系統將會創建新的Activity實例。現在存在的Activity由下到上有:
SingleTaskModleActivity→OnotherActivity
(2) 通過上面步驟,我們所處Activity為OnotherActivity,此時點擊按鈕“啟動SingleTaskModle_Activity”跳轉到SingleTaskModleActivity,由於SingleTaskModleActivity是以默認模式(standard)啟動,所以會創建一個新的Activity實例:此時Activity由下到上有:
SingleTaskModleActivity...1→OnotherActivity→SingleTaskModleActivity...2
(3)通過以上步驟,處於SingleTaskModleActivity,此時再次點擊按鈕“啟動Onother_Activity”跳轉到OnotherActivity,並以singleTask
模式啟動,此時已經有一個OnotherActivity存在於第二層沒有位於棧頂,所以當啟動它時會把第二層上面的所有Activity(現在只有SingleTaskModleActivity...2)移除Task棧,讓OnotherActivity轉入棧頂。此時存在的Activity由下到上有:
SingleTaskModleActivity→OnotherActivity
四、singleInstance(單一實例)加載模式:
在這種加載模式下,系統保證無論從哪個task中啟動目標Activity,只會創建一個目標Activity實例,並會使用一個全新的Task棧來加載該Activity實例。
*如果將要啟動的目標Activity不存在,系統就會先創建一個全新的Task,再創建目標Activity的實例,並將其加入新的Task棧頂。
*如果將要啟動的目標Acticity已經存在,無論它位於哪個應用程序中,位於哪個Task棧中,系統都會把該Activity所在的Task轉到前台,從而使該Activity顯示出來。
五、一些應用場景:
singleTop:適合接收通知啟動的內容顯示頁面。例如,某個新聞客戶端的新聞內容頁面,如果收到10個新聞推送,每次都打開一個新聞內容頁面是很煩人的。
從外界可能多次跳轉到一個界面
singleTask:適合作為程序入口點。例如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,並且會清空主界面上面的其他頁面。
singleInstance:適合需要與程序分離開的頁面。例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用於中間頁面,如果用於中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。(某個應用中用到了google地圖,當退出該應用的時候,進入google地圖,還是剛才的界面)
