activity的四种加载模式

在开发中经常会遇到这样的问题:如果想调用Activity,除了结束栈顶Activity来显示下一个Activity,就只能新创建Activity的实例了;如果调用频率高的话,就会产生大量重复的Activity实例,势必耗费系统的大量资源。还好Google给我们提供了Activity加载模式的设置,而不是使用默认的加载模式。

Activity有4钟加载模式:standard、singleTop、singleTask和singleInstance。设置AndroidManifest.xml文件中activity元素的android:launchMode属性:

<activity android:name=".Activity1" android:launchMode="singleTask"/>

下面介绍这四种模式的区别。

1.standard是默认的加载模式,不需要配置launchMode。该加载模式每次都会创建新的实例,一般使用比较Activity实例的ToString方法的值是否相同来验证。ActivityMain的关键代码如下所示:

//初始化按钮对象

Button gotoBtn = (Button)findViewById(R.id.gotoBtn);

final TextView nameTextView = (TextView)findViewById(R.id.nameTextView);

nameTextView.setText("该实例的地址:"+this.toString());

//对按钮进行事件监听

gotoBtn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

//通过传递一个Intent对象以载入自己

Intent intent = new Intent(ActivityMain.this,Activity1.class);

          startActivity(intent);

}

});

2.singleTop不是每次都创建Activity实例,如果创建Intent的时候栈顶已经有要创建的Activity的实例,则直接将Intent发送给它,不会再创建新实例。用上面的代码直接改为singleTop,进入Activity1后单击房子键,再启动程序进入Activity1,就会发现还是上一次的实例,且执行onNewIntent(Intent intent)方法再执行onResume()方法,而不是执行onCreate(Bundle savedInstanceState)方法,因为该Activity一直处于栈顶。

3.singleTask和singleInstance模式都是只创建一个实例,需要Activity的时候,系统会检查栈里面是否已经存在该Activity的实例,如果有,则直接将Intent发送给它。

4.singleInstance创建的Activity总是在顶部的堆栈,该Activity独占一个Task,其它Activity不能存在于这个Task里,然而一个singleTask创建的Activity可以有其它的Activity在它的上面叠加。以singleInstance模式启动一个新的Activity,新的Activity都将会到新的Task里运行,如同加了FLAG_ACTIVITY_NEW_TASK参数。而除了singleInstance,另外3中模式则可以和其他Activity共存。

为了验证singleInstance创建的Activity1实例的TaskID与ActivityMain的TaskID是否相同,修改ActivityMain的加载模式为standard,Activity1为singleInstance,使Activity1处于一个独立的任务中。经检验可以发现TaskID不同了,即不是同一个任务了。因为singleInstance创建的Activity总是在顶部的堆栈,且独占一个Task,所以这时单击返回键,该Activity会被移出栈,栈里面没有Activity随之Task也退出了。返回后再单击“进入Activity1”按钮,又产生了一个新的Task。

如果Activity1为singleTask,那么ActivityMain和Activity1的TaskID是相同的,即在同一个任务中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值