zoukankan      html  css  js  c++  java
  • activity启动模式之singleTop

    我们紧跟着上一节继续学习。

    这个模式解释如下

    singleTop

    如果一个以singleTop模式启动的activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实 例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。举例来说,如果A的启动模式为 singleTop,并且A的一个实例已经存在于栈顶中,那么再调用startActivity(new Intent(this,A.class))启动A时,不会再次创建A的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()方法。 这是任务桟中还是这有一个A的实例。
    如果以singleTop模式启动的activity的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard模式相同,也会创建多个实例。
     
    还是直接看demo来学习
    manifest.xml关键代码
    <activity
                android:name=".HeadSetActivity"
                android:launchMode="singleTop" >

    HeadSetActivity.java关键代码

    button1.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    //启动activity1
                    Intent intent = new Intent();
                    intent.setClass(HeadSetActivity.this, HeadSetActivity.class);
                    startActivity(intent);
                }
            });
            button2.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    //启动activity2
                    Intent intent = new Intent("activity_one");
                    startActivity(intent);
                    
                }
            });

    MyActivity1.java关键代码

    button1.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    Intent intent = new Intent();
                    intent.setClass(MyActivity1.this, HeadSetActivity.class);
                    startActivity(intent);
                    
    
                }
            });

    我们还是看一下堆栈结果吧

    启动顺序为

    HeadSetActivity->HeadSetActivity->MyActivity1->HeadSetActivity

    Stack #1: 
        Task id #75 
        * TaskRecord{433ec228 #75 A=com.example.alert U=0 sz=3}
          numActivities=3 rootWasReset=true userId=0 mTaskType=0 numFullscreen=3 mOnTopOfHome=true
          affinity=com.example.alert
          intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.alert/.HeadSetActivity}
          realActivity=com.example.alert/.HeadSetActivity
          Activities=[ActivityRecord{43088170 u0 com.example.alert/.HeadSetActivity t75}, ActivityRecord{430927f8 u0 com.example.alert/.MyActivity1 t75}, ActivityRecord{430caaa8 u0 com.example.alert/.HeadSetActivity t75}]
          askedCompatMode=false
          lastThumbnail=null lastDescription=null
          lastActiveTime=72250526 (inactive for 2s) 
          * Hist #2: ActivityRecord{430caaa8 u0 com.example.alert/.HeadSetActivity t75}
              packageName=com.example.alert processName=com.example.alert
              launchedFromUid=10107 launchedFromPackage=com.example.alert userId=0
              app=ProcessRecord{42cb3130 31523:com.example.alert/u0a107}
              Intent { cmp=com.example.alert/.HeadSetActivity }
              frontOfTask=false task=TaskRecord{433ec228 #75 A=com.example.alert U=0 sz=3}
              taskAffinity=com.example.alert
              realActivity=com.example.alert/.HeadSetActivity
    ..........
    
     * Hist #1: ActivityRecord{430927f8 u0 com.example.alert/.MyActivity1 t75}
              packageName=com.example.alert processName=com.example.alert
              launchedFromUid=10107 launchedFromPackage=com.example.alert userId=0
              app=ProcessRecord{42cb3130 31523:com.example.alert/u0a107}
              Intent { act=activity_one cmp=com.example.alert/.MyActivity1 }
              frontOfTask=false task=TaskRecord{433ec228 #75 A=com.example.alert U=0 sz=3}
              taskAffinity=com.example.alert
              realActivity=com.example.alert/.MyActivity1
              baseDir=/data/app/com.example.alert-2.apk
              dataDir=/data/data/com.example.alert
    ..........
     * Hist #0: ActivityRecord{43088170 u0 com.example.alert/.HeadSetActivity t75}
              packageName=com.example.alert processName=com.example.alert
              launchedFromUid=10016 launchedFromPackage=com.miui.home userId=0
              app=ProcessRecord{42cb3130 31523:com.example.alert/u0a107}
              Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.alert/.HeadSetActivity bnds=[34,84][170,220] }
              frontOfTask=true task=TaskRecord{433ec228 #75 A=com.example.alert U=0 sz=3}
              taskAffinity=com.example.alert
              realActivity=com.example.alert/.HeadSetActivity
              baseDir=/data/app/com.example.alert-2.apk


    从上面的结果我们可以很清除的知道

    当HeadSetActivity 启动它自身的时候,这个时候HeadSetActivity在栈顶,所以它不会重新创建

    当HeadSetActivity 启动了MyActivity1以后,这时候HeadSetActivity在栈底,栈顶是MyActivity1,所以MyActivity1启动HeadSetActivity的时候,HeadSetActivity实例重新创建入栈

  • 相关阅读:
    angular 动态取到的html片段 在页面的展示
    angular 1.2.29版本下 动态添加多个表单、 校验全部、 提交 、ng-form方案
    解决JS浮点数(小数)计算加减乘除的BUG
    angular分页插件tm.pagination 解决触发二次请求的问题
    Powershell中显示隐藏文件
    canvas 弹幕效果
    安装指南【win10下安装fedora】
    centos7安装chrome的历程(fedora同)
    安装指南:Win10下安装CentOs7
    pushState与replaceState区别
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_singleTop_15924163.html
Copyright © 2011-2022 走看看