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: