Activity的四种启动模式

1.Activity的启动模式对应的属性为:

android:launchMode="standard"

属性值有4个,即对应4种不同的启动模式
standard:标准模式。默认模式
singleTop:Task顶部单例模式
singleTask:Task内单例模式
singleInstance:全局单实例模式

2.standard模式
默认情况下在Activity的配置中不写launchMode的话,即是standard模式。
使用这种模式,每次启动Activity时,总是创建一个新的Activity实例,并把这个Activity实例添加到当前的Task中(不会创建新的Task),不管这个Task中是否之前已经有了一个相同的Activity的实例。
例如:在MainActivity中有一个button,可以打开TestActivity,在TestActivity中,有一个button,可以再打开一个TestActivity。同时会在Activity中显示Activity.toString以及TaskID。
public class MainActivity extends Activity implements OnClickListener {
	private Button enterBtn = null;
	private TextView taskIdTv = null;
	private TextView activityTv = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		enterBtn = (Button) findViewById(R.id.enterBtn);
		taskIdTv = (TextView) findViewById(R.id.taskIdTv);
		activityTv = (TextView) findViewById(R.id.activityTv);
		
		enterBtn.setOnClickListener(this);
		taskIdTv.setText(this.getTaskId()+"");
		activityTv.setText(this.toString());
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v.getId() == R.id.enterBtn) {
			Intent intent = new Intent();
			intent.setClass(MainActivity.this, TestActivity.class);
			startActivity(intent);
		}
	}
}

public class TestActivity extends Activity implements OnClickListener{
	
	private Button openBtn = null;
	private TextView showTaskIdTv = null;
	private TextView showActivityTv = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_activity);
		
		openBtn = (Button) findViewById(R.id.openBtn);
		showTaskIdTv = (TextView) findViewById(R.id.showTaskIdTv);
		showActivityTv = (TextView) findViewById(R.id.showActivityTv);
		openBtn.setOnClickListener(this);
		
		showTaskIdTv.setText(this.getTaskId()+"");
		showActivityTv.setText(this.toString());
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v.getId() == R.id.openBtn) {
			Intent intent = new Intent();
			intent.setClass(TestActivity.this, TestActivity.class);
			startActivity(intent);
		}
	}
}

 <activity
            android:name="com.example.finishtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.finishtest.TestActivity"
            android:launchMode="standard" >
        </activity>

布局文件就不贴出来。
运行结果为:
打开应用,MainActivity运行后显示:

点击打开Activity按钮,TestActivity中显示:


再次点击打开Activity按钮,TestActivity中显示:


根据显示结果来看,不管当前Task中是否已经有了TestActivity,都会生成新的TestActivity。并且被加入在原Task中。
在按返回键的时候,会一个一个回退回去。

3. singleTop模式
需要在Activity的配置中加入:
android:launchMode="singleTop"
当将要启动的Activity已经位于Task顶部,则不创建新的Activity实例,而是直接使用已有的Activity实例。
Java代码如standard模式,只是在Manifest文件的配置中:
 <activity
            android:name="com.example.finishtest.TestActivity"
            android:launchMode="singleTop" >
        </activity>
打开应用,MainActivity显示:

点击打开Activity按钮,TestActivity中显示:


继续点击,不会新创建一个Activity实例:



4. singleTask模式
在同一个Task中已经存在了将要创建的Activity的实例,则直接复用,不再新创建Activity实例。即在同一个Task中,只存在同一个Activity的一个实例。
分3种情况:
(1)在Task中将要创建的Activity不存在,则创建Activity的实例。
(2) 在Task中将要创建的Activity存在,且位于栈顶,则不创建 Activity的实例,直接复用。此时与 singleTop模式一致
(3) 在Task中将要创建的Activity存在,不位于栈顶,则系统把位于该Activity实例之上的搜有Activity移出Task,使得目标Activity位于栈顶。
第一、二种情况比较简单好理解。主要说明下第三种情况。
在standard实例的基础上,增加一个Activity,用于打开TestActivity:
public class TestActivityTwo extends Activity implements OnClickListener{
	
	private Button accessBtn = null;
	private TextView showTaskIdTwoTv = null;
	private TextView showActivityTwoTv = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_activity_two);
		
		accessBtn = (Button) findViewById(R.id.accessBtn);
		showTaskIdTwoTv = (TextView) findViewById(R.id.showTaskIdTwoTv);
		showActivityTwoTv = (TextView) findViewById(R.id.showActivityTwoTv);
		accessBtn.setOnClickListener(this);
		
		showTaskIdTwoTv.setText(this.getTaskId()+"");
		showActivityTwoTv.setText(this.toString());
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v.getId() == R.id.accessBtn) {
			Intent intent = new Intent();
			intent.setClass(TestActivityTwo.this, TestActivity.class);
			startActivity(intent);
		}
	}
}

<activity
            android:name="com.example.finishtest.TestActivity"
            android:launchMode="singleTask" >
        </activity>

打开应用,运行MainActivity:


再点击打开Activity,进入TestActivity:


再点击打开Activity,进入TestActivityTwo:


再点击打开Activity,进入TestActivity:


可以看到,使用的还是之前的Activity实例,没有新创建一个Activity实例。
接着按返回键,应该直接退回到MainActivity,因为在TestActivity之上的 TestActivityTwo已经被移出Task了

5.  singleInstance模式
无论从哪个Task中启动目标Activity,只会创建一个Activity实例,并且会使用一个新的Task来存放该Activity。
分2种情况:
(1)还不存在将要启动的Activity,则系统创建一个新的Task,再创建目标Activity,把目标Activity放入新的Task中(在栈顶,Task种只有这个Activity)。
(2) 将要启动的Activity已经存在,则不管其位于哪个程序中,哪个Task中,系统都将这个Activity转到栈顶显示出来。并且该栈中只有这个Activity。
情况一的实例:跟上面的实例相同,只是Manifest文件中的launcherMode改成singleInstance:
<activity
            android:name="com.example.finishtest.TestActivity"
            android:launchMode="singleInstance" >
        </activity>
打开应用,运行MainActivity:


再点击打开Activity,进入TestActivity(ID应该是不同的)


再点击打开Activity,进入TestActivityTwo(ID应该是不同的)


再点击打开Activity,进入TestActivity(ID应该还是5)


情况二:
在别的程序中打开这个TestActivity,
case R.id.showBtn:			
			Intent intent = new Intent();
			intent.setAction("com.example.finishtest.TestActivity.TEST");
			startActivity(intent);
			break;
之前打开的时候,MainActivity中显示为:

点击后,TestActivity中的显示为:


打开另一个应用,再打开TestActivity:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值