activity:launchMode

 

指示activity如何启动,有四种模式:

"standard"
"singleTop"
"singleTask"
"singleInstance"

可在AndroidManifest.xml配置<activity>的android:launchMode属性。

1、 Standard(默认)

每次都生成新的实例,下面以一个例子说明,新建AActivity,使用默认launchMode,代码如下:

package test.stack;

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.TextView;

public class AActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("A");
        TextView txt = (TextView) findViewById(R.id.tx);
        txt.setText(this.toString());
        Button btn = (Button) findViewById(R.id.button);
        btn.setText("A");
        btn.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
		        Intent in = new Intent(AActivity.this,AActivity.class);		        
		        startActivity(in);	
			}
		});

    }
}

 

  AActivity界面中的TextView用于显示当前Activity实例的序列号,Button跳转到下一个AActivity界面。

连续2次点击A按钮,会出现下面现象:

输出日志:

连续按三次返回才能回到桌面。

2、SingleTop

一般情况和Standard一样,生成新的实例,不同之处是如果activity处于栈顶,不再生成新的实例,新建BActivity,<activity>指定属性android:launchMode="singleTop",代码如下:

package test.stack;

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.TextView;

public class BActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("B");
        TextView txt = (TextView) findViewById(R.id.tx);
        txt.setText(this.toString());
        Button btn = (Button) findViewById(R.id.button);
        btn.setText("B");
        btn.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
		        Intent in = new Intent(BActivity.this,BActivity.class);
		        startActivity(in);	
			}
		});
    }
}

AActivity中改为点击AActivity跳转到BActivity,操作点击A,连续点击两次B,情况如下:

 

BActivity在栈顶没有生成新的实例,按一次返回,直接返回AAcrivity。

3、SingleTask

SingleTask,不再生成新的实例,并且如果发现有相同的实例,则使同一栈中该实例以上的activity的实例出栈,  新建CActivity,<activity>指定属性android:launchMode="singleTask",代码如下:

package test.stack;

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.TextView;

public class CActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("C");
        TextView txt = (TextView) findViewById(R.id.tx);
        txt.setText(this.toString());
        Button btn = (Button) findViewById(R.id.button);
        btn.setText("C");
        btn.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
		        Intent in = new Intent(CActivity.this,BActivity.class);
		        startActivity(in);	
			}
		});
    }
}

  同时修改AActivity,BActivity代码,形成跳转顺序为A->C->B->C,如图:

日志输出如下:

按返回,C直接回到A,B已出栈

4、singleInstance

不再生成新的实例,同时位于新的栈结构,并且该栈只有唯一实例,新建DActivity,,<activity>指定属性android:launchMode="singleInstance",代码如下:

package test.stack;

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.TextView;

public class DActivity extends Activity {
    /** Called when the activity is first created. */
	TextView txt;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("D");
        txt = (TextView) findViewById(R.id.tx);
        txt.setText(this.toString());
        Button btn = (Button) findViewById(R.id.button);
        btn.setText("D");
        btn.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
		        Intent in = new Intent(DActivity.this,BActivity.class);
		        startActivity(in);	
			}
		});
    }
    
    @Override
    protected void onResume() {
    	// TODO Auto-generated method stub
    	super.onResume();
    }
}

  同时修改AActivity,BActivity代码,形成跳转顺序为A->D->B->A->D->B,输出日志如图:

依次按返回,形成的顺序为B->A->B->A->D,D在新的栈中,A所在栈的实例都出栈后才会显示D.

 

 

posted on 2012-04-16 12:29  memorysea  阅读(242)  评论(0)    收藏  举报

导航