在Android中,每个Activity有4种LaunchMode,默认是standard,下面对这四种模式进行实例验证加深理解。
设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。
界面如下:(上面的一行文字用来识别是在A界面还是在B界面)
在代码中实现onCreate():
Button btnA = (Button)findViewById(R.id.btnA);
btnA.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(A.this, A.class));
}
});
Button btnB = (Button)findViewById(R.id.btnB);
btnB.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(A.this, B.class));
}
});
Log.e("Task:"+getTaskId(), "A" + mId + " created.");
onNewIntent():
Log.e("Task:"+getTaskId(), "A" + mId + " onNewIntent.");
onDestroy():
Log.e("Task:"+getTaskId(), "A" + mId + " destroyed.");
这样就可以直观的从Logcat输出中看到Activity的创建、销毁以及请求的响应。
1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出:
Task:9(380): A1 created.
A被创建了一个实例A1,并且放在了任务9中。
此时任务栈中内容为:
A
点击界面上启动A的按钮,看到输出:
Task:9(380): A2 created.
A再次被创建了一个新的实例A2,仍然放在任务9中。
此时任务栈中内容为:
AA
点击启动B的按钮,
Task:9(380): B1 created.
B被创建一个新的实例B1,仍然放在任务9中。
此时任务栈内容为:
AAB
再启动B,
Task:9(380): B2 created.
B又被创建了一个新的实例B2,仍然在任务9中。
任务栈内容为:
AABB
按Back键依次返回桌面,输出依次为:
Task:9(380): B2 destroyed.
Task:9(380): B1 destroyed.
Task:9(380): A2 destroyed.
Task:9(380): A1 destroyed.
任务栈的变化次序为:
AABB
AAB
AA
A
结论:
每个Intent,都创建了一个新的Activity来响应,并且Back时是按照弹栈的顺序处理的。
2.B设置为SingleTop,启动Ap:
Task:10(409): A1 created.
再启动A:
Task:10(409): A2 created.
再启动B:
Task:10(409): B1 created.
再启动B:
Task:10(409): B1 onNewIntent.
结论:
当B不在栈顶时,仍然会创建B的新实例。
当B在栈顶时,请求启动B的Intent并没有触发创建B的新实例,而是触发了栈顶B的onNewIntent()
按Back键依次返回桌面,输出依次为:
Task:10(409): B1 destroyed.
Task:10(409): A2 destroyed.
Task:10(409): A1 destroyed.
结论:
虽然发送了四次Intent,但实际上只创建了3个Activity,所以只有3次销毁输出。
3.B设置为SingleTask,启动Ap:
Task:11(438): A1 created.
启动B:
Task:11(438): B1 created.
启动A:
Task:11(438): A2 created.
启动B:
Task:11(438): B1 onNewIntent.
Task:11(438): A2 destroyed.
结论:
当B已经存在时,再次请求B会触发已经存在的B1实例的onNewIntent;
并且如果B所在的任务栈上面有其他Activity,那么其他Activity会被销毁。
4.B设置为SingleInstance,启动Ap:
Task:12(466): A1 created.
启动B,
此时新创建了任务栈13,和先前的A1并不在一个任务。
Task:13(466): B1 created.
再启动B,没有创建新实例:
Task:13(466): B1 onNewIntent.
再启动A,再旧的任务12中创建了A的新实例
Task:12(466): A2 created.
按下Back键:
Task:12(466): A2 destroyed.
看输出和前面没区别,但是
注意界面,此时不是切换到B界面,因为此时活动任务是12,所以A1被显示了出来。
再次按下Back键:
Task:12(466): A1 destroyed.
此时因为任务12已经结束,B1所在的任务13成为活动任务,B1的界面才被显示出来。
- 大小: 7.6 KB
分享到:
相关推荐
Android Activity LaunchMode
Android Activity 加载模式 测试
这个文章《Android启动模式浅析》中用到的例子代码,希望需要的朋友可以去下载。
Activity 的启动模式(android:launchMode) Android Activity 的四种启动模式 管理Activity的生命周期 Android入门:Activity四种启动模式 Android Intent Android中Intent传递对象的两种方法...
android中launchMode四种启动方法详解.pdf
NULL 博文链接:https://zxl-ong.iteye.com/blog/875779
Activity的launchMode测试
NULL 博文链接:https://kevindan.iteye.com/blog/1991346
<activity android:name=".MainActivity"android:launchMode="standard" /> Activity的四种启动模式: 1.standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。 2.singleTop 如果在...
这是学习 Android launchMode写的小例子
android LaunchMode测试实例 代码
介绍了Android LaunchMode的4种启动方法。
Activity是Android最常用的组件之一,也是最直观的组件,Activity启动时有四种模式,分别是: “standard” "singleTop" "singleTask" "singleInstance" 其中"standard"是默认模式。
主要介绍了Android开发中Activity的四种launchMode,launchMode主要用于控制多个Activity间的跳转,需要的朋友可以参考下
详细测试生命周期的流程、通过demo反应launchMode的作用,onActivityResult方法的使用。
文章地址http://blog.csdn.net/kasogg/article/details/50433664。
之前遇到了onActivityResult提前调用的问题,说是和activity的启动模式有关,就做了一个Demo将四种启动方式都测试了一下,里面包括 onActivityResult的使用以及在四种不同启动模式下使用效果的不同情况
android 启动 LaunchMode
主要介绍了Android LaunchMode四种启动模式详细介绍的相关资料,这里对launchmode的使用方法进行了详解及启动模式的比较,需要的朋友可以参考下