在开发中经常会遇到这样的问题:如果想调用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是相同的,即在同一个任务中。