zoukankan      html  css  js  c++  java
  • 关Activity的Launch mode

    在Android中,每个Activity有4种LaunchMode,默认是standard,下面对这四种模式进行实例验证加深理解。 


    设计两个Activity,分别称为A,B,每个Activity上面都放置两个按钮,一个启动A,一个启动B。 

    界面如下:(上面的一行文字用来识别是在A界面还是在B界面) 
     

    在代码中实现onCreate(): 
    Java代码  收藏代码
    1. Button btnA = (Button)findViewById(R.id.btnA);  
    2.         btnA.setOnClickListener(new OnClickListener() {           
    3.             public void onClick(View v) {  
    4.                 // TODO Auto-generated method stub  
    5.                 startActivity(new Intent(A.this, A.class));  
    6.             }  
    7.         });  
    8.           
    9.         Button btnB = (Button)findViewById(R.id.btnB);  
    10.         btnB.setOnClickListener(new OnClickListener() {           
    11.             public void onClick(View v) {  
    12.                 // TODO Auto-generated method stub  
    13.                 startActivity(new Intent(A.this, B.class));  
    14.             }  
    15.         });  
    16.           
    17.         Log.e("Task:"+getTaskId(), "A" + mId + " created.");   



    onNewIntent(): 
    Java代码  收藏代码
    1. Log.e("Task:"+getTaskId(), "A" + mId + " onNewIntent.");  


    onDestroy(): 
    Java代码  收藏代码
    1. Log.e("Task:"+getTaskId(), "A" + mId + " destroyed.");  


    这样就可以直观的从Logcat输出中看到Activity的创建、销毁以及请求的响应。 

    1.两个Actiity的LaunchMode都为默认的standard,启动Ap,看到输出: 
    Task:9(380): A1 created. 

    A被创建了一个实例A1,并且放在了任务9中。 
    此时任务栈中内容为: 


    点击界面上启动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 


    结论: 
    每个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的界面才被显示出来。 

    Demo 下载 

    文章来源:http://mypyg.iteye.com/blog/919643 
     

    作者:码农豆豆
    微信公众号:
    出处:http://www.cnblogs.com/fly_binbin/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    Java swing 代码例子
    MySql
    swing 下拉菜单
    uiautomator2.0的配置的两种方法
    【Java】边框总结
    Java可视操作界面例子
    Java多线程例子
    使用Java让android手机自动执行重复重启
    形参的一种特殊写法
    this 基础使用方法
  • 原文地址:https://www.cnblogs.com/fly_binbin/p/2341773.html
Copyright © 2011-2022 走看看