我们紧跟着上一节继续学习。
这个模式解释如下
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实例重新创建入栈