activity啓動模式分析

 文章來源:http://blog.csdn.net/leiswpu/article/details/6248528


Android Activity啓動模式分析


在Android的聯機文檔中,有對Activity的簡單介紹,現在通過編寫代碼對Activity的啓動模式做一個深入的理解。 
在配置文件AndroidManifest.xml中,activity元素的android:launchMode屬性用來配置對應Activity的啓動模式,目前有以下四種啓動模式: 
1.standard 
2.singleTop 
3.singleTask 
4.singleInstance 
如果不對Activity設置啓動模式,默認就是standard模式

一、standard

請看以下代碼,實現了一個Activity :
public class A_Activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        TextView textView=new TextView(this); 
        textView.setText(this+"");//這裏用於打印當前Activity的hashcode,可以此判斷Activity實例是不是同一個對象 
        Button button=new Button(this); 
        button.setText("Go next activity"); 
        button.setOnClickListener(new OnClickListener(){

            public void onClick(View v) { 
                // TODO Auto-generated method stub 
                Intent intent=new Intent(); 
                intent.setClass(A_Activity.this, A_Activity.class);//說明發出Intent與啓動的Activity都是A_Activity的實例
                startActivity(intent); 
            } 
        }); 
        LinearLayout layout=new LinearLayout(this); 
        layout.setOrientation(LinearLayout.VERTICAL); 
        layout.addView(textView); 
        layout.addView(button); 
        setContentView(layout); 
    } 

運行之,請看下圖: 
 
點擊button後,注意看第一行的textView 
 
由此可知,生成了新的A_Activity對象,這時我們按回退鍵,就會依次回到之前的Activity。點擊button的過程就是壓棧的過程,在standard模式下,就會不斷生成新的Activity對象

二、singleTop

singleTop和standard模式都會將intent發送給新的Activity實例,不同的是,如果創建Intent的時候棧頂有要創建的singleTop模式下的Activity實例,則將Intent發送給該實例,不會再創建Activity的新實例。 
還是使用之前的代碼,只是設置A_Activity的啓動模式爲singleTop:android:launchMode="singleTop",運行之,請看下圖: 
 
這個時候我們無論點擊多少次button,textView都顯示同一個Activity實例,按回退鍵時會直接退出程序,表明在singleTop模式下,如果在棧頂存在Intent中那個目標Activity的實例,就不會創建新的實例,而直接使用棧頂的對象,對於資源有限的移動設備來說,也是有實際意義的。 
如果是在不同Activity之間跳轉,就會跟standard模式的情形一樣,請看下面代碼:
public class A_Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textView=new TextView(this);
        textView.setText(this+"");
        Button button=new Button(this);
        button.setText("Go B_Activity");
        button.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent();
                intent.setClass(A_Activity.this, B_Activity.class);//從A跳轉到B 
                startActivity(intent);
            }
        });
        LinearLayout layout=new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(textView);
        layout.addView(button);
        setContentView(layout);
    }
}
public class B_Activity extends Activity { 
    /**<li>Description: </li>
     *
     * @param savedInstanceState
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        TextView textView=new TextView(this);
        textView.setText(this+"");
        Button button=new Button(this);
        button.setText("Go A_Activity");
        button.setOnClickListener(new OnClickListener(){ 
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent();
                intent.setClass(B_Activity.this, A_Activity.class);//從B跳轉到A
                startActivity(intent);
            }
        });
        LinearLayout layout=new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(textView);
        layout.addView(button);
        setContentView(layout);
    }
}
運行後,如下圖:
 
點擊button後:
 
再點擊button後:
 
這樣每次都會創建目標Activity的新實例,因爲在跳轉時,處於棧頂的對象不是目標Activity的實例

三、singleTask

singleTask模式只能創建一個實例,當發送一個Intent,目標Activity爲singleTask模式時,系統會檢查棧裏面是否已經有該Activity的實例,如果有就直接將Intent發送給它,還是使用(二)中的代碼,將A_Activity啓動模式設置爲singleTask,B_Activity啓動模式設置爲standard,啓動後如下圖:
 
點擊button後:
 
繼續點擊button:
 
由此可知,singleTask模式的A_Activity在棧中只有一個實例,可以被重複使用
並且,如果收到Intent生成一個新實例,那麼用戶可以通過回退鍵回到上一個狀態,如果是已經存在的一個activity來處理這個Intent的話,就無法通過回退鍵回到上一個狀態(對singleInstance同樣適用) ,比如剛纔最後一步如果再按回退鍵,就會直接退出程序,而不會回到上一步的狀態。

四、singleInstance

這個模式下的Activity在一個單獨的task棧中,這個棧也只能包含一個Activity的實例,將上面代碼稍微改動一下,顯示taskId:
A_Activity 中:textView.setText(this.getTaskId()+"");
B_Activity 中:textView.setText(this.getTaskId()+"");
另外將B_Activity 設置爲singleInstance模式,A_Activity 設置爲standard模式,啓動後:
 
點擊button後:
 
表明啓動了新的task

總結四個模式的不同:
1、Intent的目標Activity由哪個task持有
standard與singleTop的Activity所在task,與收到的Intent的發送者所在task相同,除非Intent包括參數FLAG_ACTIVITY_NEW_TASK,該參數會啓動Activity到新的task中;singleTask和singleInstance總是把Activity作爲一個task的根元素,它們不會被啓動到其他task裏
2、是否允許Activity的多個實例
standard與singleTop可以被實例化多次,可以存在不同task中,並且一個task可以包括同一activity的多個實例
singleTask與singleInstance則在同一個task中只能允許Activity的一個實例,並且是task的根元素
3、在同一個task棧中,是否允許其他Activity的實例存在
singleInstance單獨在一個task中,其他啓動模式允許不同Activity的實例存在
4、是否每次生成新實例接收Intent
standard每次啓動都會生成新實例
singleTop的activity如果在task的棧頂的話,則不生成新的activity實例,直接使用該實例,否則,就要生成新的實例
singleInstance在所在棧中是唯一的activity,它每次都會被重用
singleTask如果task棧中有該模式的Activity,就不生成新的activity實例,直接使用該實例,否則,就要生成新的實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章