Android中Activity的LunchMode参数详解
来源:互联网 发布:淘宝的体验中心在哪里 编辑:程序博客网 时间:2024/05/21 10:20
在Android中,每个Activity有4种LaunchMode,分别是:standard、singleTop、singleTask、singleInstance,默认是standard。在AndroidManifest.xml的对应Activity中配置该参数。下面对这四种模式进行实例验证加深理解。
设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。界面如下:(上面的一行文字用来识别是在A界面还是在B界面)
此图为A界面,B界面没有最上一行的字。
A界面java代码如下:
- public class LunchModeActivityA extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button buttonActivityA = (Button) this.findViewById(R.id.buttonActivityA);
- Button buttonActivityB = (Button) this.findViewById(R.id.buttonActivityB);
- //启动ActivityB
- buttonActivityA.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent _intentB = new Intent(LunchModeActivityA.this,LunchModeActivityB.class);
- startActivity(_intentB);
- }
- });
- //启动ActivityA
- buttonActivityB.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent _intentA = new Intent(LunchModeActivityA.this,LunchModeActivityA.class);
- startActivity(_intentA);
- }
- });
- Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onCreate.");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onDestroy.");
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onNewIntent.");
- }
- }
同理,LunchModeActivityB也类似实现,重装上面三个方法并进行log跟踪。
测试开始:
1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出:
Task:11 LunchModeActivityA onCreate.
A被创建了一个实例A,并且放在了任务11中。
此时任务栈中内容为:
A
点击界面上启动A的按钮,看到输出:
Task:11 LunchModeActivityA onCreate.
A再次被创建了一个新的实例A,仍然放在任务11中。
此时任务栈中内容为:
AA
点击启动B的按钮,
Task:11 LunchModeActivityB onCreate.
B被创建一个新的实例B,仍然放在任务11中。
此时任务栈内容为:
AAB
再启动B,
Task:11 LunchModeActivityB onCreate.
B又被创建了一个新的实例B,仍然在任务11中。
任务栈内容为:
AABB
按Back键依次返回桌面,输出依次为:
Task:11 LunchModeActivityB onDestroy.
Task:11 LunchModeActivityB onDestroy.
Task:11 LunchModeActivityA onDestroy.
Task:11 LunchModeActivityA onDestroy.
任务栈的变化次序为:
AABB
AAB
AA
A
结论:
每个Intent,都创建了一个新的Activity来响应,并且Back时是按照弹栈的顺序处理的。
2.B设置为SingleTop,启动Ap:
Task:12 LunchModeActivityA onCreate.
再启动A:
Task:12 LunchModeActivityA onCreate.
再启动B:
Task:12 LunchModeActivityB onCreate.
再启动B:
Task:12 LunchModeActivityB onNewIntent.
结论:
当B不在栈顶时,仍然会创建B的新实例。
当B在栈顶时,请求启动B的Intent并没有触发创建B的新实例,而是触发了栈顶B的onNewIntent()
按Back键依次返回桌面,输出依次为:
Task:12 LunchModeActivityB onDestroy.
Task:12 LunchModeActivityA onDestroy.
Task:12 LunchModeActivityA onDestroy.
结论:
虽然发送了四次Intent,但实际上只创建了3个Activity,所以只有3次销毁输出。
3.B设置为SingleTask,启动Ap:
Task:3 LunchModeActivityA onCreate.
启动B:
Task:3 LunchModeActivityB onCreate.
启动A:
Task:3 LunchModeActivityA onCreate.
启动B:
Task:3 LunchModeActivityB onNewIntent.
Task:3 LunchModeActivityA destroyed.
结论:
当B已经存在时,再次请求B会触发已经存在的B实例的onNewIntent;
并且如果B所在的任务栈上面有其他Activity,那么其他Activity会被销毁。
4.B设置为SingleInstance,启动Ap:
Task:4 LunchModeActivityA onCreate.
启动B,此时新创建了任务栈5,和先前的A并不在一个任务。
Task:5 LunchModeActivityB onCreate.
再启动B,没有创建新实例:
Task:5 LunchModeActivityB onNewIntent.
再启动A,再旧的任务4中创建了A的新实例
Task:4 LunchModeActivityA onCreate.
按下Back键:
Task:4 LunchModeActivityA onDestroy.
看输出和前面没区别,但是注意界面,此时不是切换到B界面,因为此时活动任务是4,所以A被显示了出来。
再次按下Back键:
Task:4 LunchModeActivityA onDestroy.
此时因为任务4已经结束,B所在的任务5成为活动任务,B的界面才被显示出来。
总结:被该属性表示的Activity会标记成另一个Taskid,并且该Activity的实例不会重复创建,back的时候是最后一个显示和退出的。
- Android中Activity的LunchMode参数详解
- activity lunchmode详解
- Android:lunchmode(Activity的四种启动模式介绍)
- Android-Activity lunchmode(SingleTask和SingleInstance)的区别
- Activity的四种lunchMode
- Activity 跳转 以及4中LunchMode
- 【Tech-Android-View】Android中的Activity的LunchMode的用法和意义
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();
- Android中activity的详解
- android Lunchmode和 Task
- android中activity详解
- Android中Activity的启动模式详解
- Android中activity的启动模式详解
- Android中Activity返回参数
- Android启动模式之lunchMode
- android的activity详解
- Android:Activity中onCreate方法的参数及用途
- 在SQL Server中对视图进行增删改
- 解决main No MyBatis mapper was found in 的警告
- telnet命令模式
- Linux下用户和文件(或是目录)的关系
- 进程同步与异步
- Android中Activity的LunchMode参数详解
- [LeetCode] [编程珠玑:变位词]Anagrams
- Merge k Sorted Lists
- 保持在主机上的权限
- cgi-bin目录
- Missing styles. Is the correct theme chosen for this layout?
- SAP生产订单归类总结(很重要)
- unicode漏洞
- objective-c-block 块