Android Activity的四種LaunchMode – Android移動開發技術文章_手機開發 Android移動開發教學課程

本文轉自: http://marshal.easymorse.com/archives/2950. 寫的非常好,分享給大傢!!!


在多Activity開發中,有可能是自己應用之間的Activity跳轉,或者夾帶其他應用的可復用Activity。可能會希望跳轉到原來某個Activity實例,而不是產生大量重復的Activity。


這需要為Activity配置特定的加載模式,而不是使用默認的加載模式。


加載模式分類及在哪裡配置
Activity有四種加載模式:


standard
singleTop
singleTask
singleInstance
設置的位置在AndroidManifest.xml文件中activity元素的android:launchMode屬性:


<activity android:name=”ActB” android:launchMode =”singleTask”></activity>


也可以在Eclipse ADT中圖形界面中編輯:


 image


區分Activity的加載模式,通過示例一目瞭然。這裡編寫瞭一個Activity A(ActA)和Activity B(ActB)循環跳轉的例子。對加載模式修改和代碼做稍微改動,就可以說明四種模式的區別。


standard
首先說standard模式,也就是默認模式,不需要配置launchMode。先隻寫一個名為ActA的Activity:


view plaincopy to clipboardprint?
package com.easymorse.activities;  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.LinearLayout;  
import android.widget.TextView;  
public class ActA 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 actA”);  
        button.setOnClickListener(new OnClickListener() {  
            @Override 
            public void onClick(View v) {  
                Intent intent = new Intent();  
                intent.setClass(ActA.this, ActA.class);  
                startActivity(intent);  
            }  
        });  
        LinearLayout layout = new LinearLayout(this);  
        layout.setOrientation(LinearLayout.VERTICAL);  
        layout.addView(textView);  
        layout.addView(button);  
        this.setContentView(layout);  
    }  

    package com.easymorse.activities;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    public class ActA 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 actA”);
            button.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setClass(ActA.this, ActA.class);
                    startActivity(intent);
                }
            });
            LinearLayout layout = new LinearLayout(this);
            layout.setOrientation(LinearLayout.VERTICAL);
            layout.addView(textView);
            layout.addView(button);
            this.setContentView(layout);
        }
    }
 


例子中都沒有用layout,免得看著羅嗦。可見是ActA –> ActA的例子。在界面中打印出對象的toString值可以根據hash code識別是否創建新ActA實例。


第一個界面:


 image


點擊按鈕後:


 image


可以多點幾次。發現每次都創建瞭該Activity的新實例。standard的加載模式就是這樣的,intent將發送給新的實例。


現在點Android設備的回退鍵,可以看到是按照剛才創建Activity實例的倒序依次出現,類似退棧的操作,而剛才操作跳轉按鈕的過程是壓棧的操作。如下圖:


 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *