四种启动模式分别是:standard,singleTop,singleTask,singleInstance
它们的启动方法都是通过给<activity>
标签指定android.launchMode
属性来选择启动模式
共同点:他们都使用返回栈来管理活动(Activity).(你们问我返回栈是什么?呵呵哒,一个抽象的玩意儿,可以想成一个房间,活动就是这个房间的住客)
看它们的不同点:
1.standard是默认的启动模式(也是最不嫌麻烦的模式),每次启动一个活动,这个活动就会入栈并且在栈的最顶端,而且,,无论返回栈里面是否曾经创建过该活动,,每次启动都会重新创建该活动的新实例.(代码如下)
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
Button FirBtn;
Button DiaBtn;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在这打印一下每次启动这个活动时的活动的实例
Log.d(TAG, "MainActivity: " + this.toString());
setContentView(R.layout.activity_main);
FirBtn = (Button) findViewById(R.id.btn_FirAct);
DiaBtn = (Button) findViewById(R.id.btn_DiaAct);
FirBtn.setOnClickListener(this);
DiaBtn.setOnClickListener(this);
}
//不要费解,你没看错,我就是要在这个Activity里面启动这个Activity(自己启动自己)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_DiaAct:
intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
break;
}
}
}
打印的log:
08-19 11:07:16.248 29925-29925/? D/MainActivity: MainActivity: com.yiyajing.firstactivity.MainActivity@4a7a28f0
08-19 11:07:17.968 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a79d148
08-19 11:07:18.708 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a7a2338
08-19 11:07:20.718 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a79bbd4
2.singleTop看名称就已经了解了,当启动活动时,如果这个活动已经处于返回栈的栈顶了,那么就会直接使用该实例,而不会再重新创建新的活动实例。But: 如果活动不在栈顶端,那么还是要重新创建的(说白了,我要找的人如果不在门口站着,,,我就当他不存在,,,(额,什么理论)).
清单文件修改(把MainActivity的启动模式改为singleTop):
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category
android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
点击三次按钮,打印的log(其他代码还是上面那套代码,,不重新放了啊)
08-19 11:11:48.954 1981-1981/com.yiyajing.firstactivity D/MainActivity: MainActivity: com.yiyajing.firstactivity.MainActivity@4a7a3c08
无论启动多少次,只要这个活动还在栈顶,就不会重新创建,但是如果该活动不在栈顶了,再次启动的时候就会重新创建该活动的实例。
3.singleTask这个启动模式弥补了singleTop的不足,只要活动选择了这个启动模式。每次启动活动的时候,它都会在返回栈中寻找该活动的实例,如果实例存在,那么就把这个活动上面的所有活动统统出栈,该活动放在栈顶(臭流氓)。如果没有发现该活动实例,那么就会创建一个新的活动实例。
4.singleInstance(我最特殊)当你将一个活动指定为singleInstance为启动模式的时候,它会启动一个新的返回栈来管理这个活动(牛比吧,老子有单间),至于为嘛要这么特殊,是为了方便别的应用程序共享这个活动的实例。咱们来实验一下,打印一下同一个应用程序下边,返回栈的ID,看看是不是有活动在搞特殊(代码如下):
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
Button FirBtn;
Button DiaBtn;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//首先打印这个默认返回栈的ID
Log.d(TAG, "This is TaskId: " + getTaskId());
setContentView(R.layout.activity_main);
FirBtn = (Button) findViewById(R.id.btn_FirAct);
DiaBtn = (Button) findViewById(R.id.btn_DiaAct);
FirBtn.setOnClickListener(this);
DiaBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_DiaAct:
intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
break;
//跳转到启动模式为singleInstance的活动中
case R.id.btn_FirAct:
intent = new Intent(MainActivity.this, FirstActivity.class);
startActivity(intent);
break;
}
}
首先打印了这个应用默认的返回栈的ID,接下来我们把FirstActivity这个活动的启动模式改为singleInstance,,并且打印这个活动的栈的ID,,,跟应用程序的ID比较(看下面代码)
public class FirstActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "FirstActivity";
Button firstBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//打印启动模式为singleInstance的活动的栈的ID
Log.d(TAG, "This is TaskId: "+ getTaskId());
setContentView(R.layout.first_activity);
firstBtn = (Button) findViewById(R.id.btn_First);
tvText = (TextView) findViewById(R.id.tv_Text);
firstBtn.setOnClickListener(this);
}
}
修改清单文件里面的launchMode(代码如下)
<activity android:name=".FirstActivity"
android:launchMode="singleInstance">
</activity>
OK,到现在为止,,大通铺有了,,单间也有了,,我们去打印一下它们的房间号,结果是:
08-19 14:44:06.203 7529-7529/com.yiyajing.firstactivity D/ FirstActivity: This is TaskId: 10
08-19 14:44:27.963 7529-7529/com.yiyajing.firstactivity D/ MainActivity: This is TaskId: 8
我们看到了,房间号不一样,FirstActivity是有单间的啦!!!