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实例重新创建入栈

原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_singleTop_15924163.html