关于Android中launchMode的文章介绍的真心不少,广为流传而且介绍的最详细的莫过于这篇文章http://blog.csdn.net/android_tutor/article/details/6310015。但是这篇文章中关于singletask和singleinstance在评论中还是有些不解和争论,在此根据实例重点说下这两种模式:

实例简介:有两个Activity,分别为AActivity和BActivity,界面相同。点击按钮A和B,分别启动AActivity和BActivity,观察效果:


上代码:

layout_task.xml

<?xml version="1.0" encoding="utf-8"?>        

AActivity.java

package com.example.activitytask;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class AActivity extends Activity{private static final String TMG = "ActivityTask";private static int mIndex = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_task)  ;mIndex++  ;Log.i(TMG,"AActivity Create"+mIndex+"  TaskId="+getTaskId())  ;Button _buttonStartA = (Button)findViewById(R.id.buttonStartA)  ;_buttonStartA.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(AActivity.this,AActivity.class)  ;startActivity(_intent) ;}}) ;Button _buttonStartB = (Button)findViewById(R.id.buttonStartB)  ;_buttonStartB.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(AActivity.this,BActivity.class)  ;startActivity(_intent) ;}}) ;}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TMG,"AActivity Destory"+mIndex+"  TaskId="+getTaskId())  ;mIndex--;}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);Log.i(TMG,"AActivity onNewIntent"+mIndex+"  TaskId="+getTaskId())  ;}}

BActivity.java

package com.example.activitytask;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class BActivity extends Activity{private static final String TMG = "ActivityTask";private static int mIndex = 0 ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_task)  ;mIndex++  ;Log.i(TMG,"BActivity Create"+mIndex+"  TaskId="+getTaskId())  ;Button _buttonStartA = (Button)findViewById(R.id.buttonStartA)  ;_buttonStartA.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(BActivity.this,AActivity.class)  ;startActivity(_intent) ;}}) ;Button _buttonStartB = (Button)findViewById(R.id.buttonStartB)  ;_buttonStartB.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent _intent = new Intent(BActivity.this,BActivity.class)  ;startActivity(_intent) ;}}) ;}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TMG,"BActivity Destory"+mIndex+"  TaskId="+getTaskId())  ;mIndex--;}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);Log.i(TMG,"BActivity onNewIntent"+mIndex+"  TaskId="+getTaskId())  ;}}

1.设置两个Activity的android:launchMode="singleTask"

<?xml version="1.0" encoding="utf-8"?>                                                                                            

程序刚启动时的打印结果

点击startB按钮打印效果

进入BActivity界面后,这时再点击startA按钮打印结果(先清屏)



这时我们发现BActivity销毁,此时再点击startB,BActivity重新创建


总结:当一个Activity被设置为singletask时

(1)它并没有创建新的任务栈(根据上面打印效果展示,AActivity和BActivity的TaskId都等于76)

(2)如果它已经存在于栈中,再次请求触发此Activity时,会调用此类实例的onNewIntent方法,不会重新创建新的实例

(3)如果此类所在的任务栈上面有其它Activity,那么其它的Activity会被销毁


2.设置两个Activity的android:launchMode="singleInstance"

<?xml version="1.0" encoding="utf-8"?>                                                                                            

程序刚启动时的打印结果


点击startB按钮打印效果


进入BActivity界面后,这时再点击startA按钮打印结果(先清屏)


再点击startB按钮打印结果(先清屏)


总结:当一个Activity被设置为singleinstance时

(1)如果此Activity没有实例,它会创建一个新的任务栈。(TaskId一个81,一个82)

(2)如果任务栈中已经有此实例,会调用onNewIntent方法,不会创建新的任务栈和实例

(3)独立成Taskstack ,并且有且仅有你自己 ,孤家寡人 。而且始终保持一个实例离栈的时候 , 先退当前的task ,再退另外的task

更多相关文章

  1. Android上传多张图片的实例代码(RxJava异步分发)
  2. 安卓 activity的四种启动模式
  3. ActivityGroup(和TabHost一样的功能)
  4. Android自定义Dialog简单实例
  5. [RK3399][Android7.1] 调试笔记 --- 默认禁止弹出USB权限对话框
  6. Android学习笔记---使用HttpClient发送POST和GET请求
  7. android UiAutomator自定义快速调试类
  8. Android(安卓)用户自定义对话框
  9. android开发AIDL实例

随机推荐

  1. Android架构组件-WorkManager
  2. Android(安卓)UI布局中设置了fill_parene
  3. android关机充电流程、充电画面显示
  4. android 仿微信聊天界面,以及语音录制功能
  5. android中空的view,可以设置为水平线
  6. Android(安卓)TextView和ImageView简单说
  7. Android修改自己程序字体
  8. android 获取路径目录方法
  9. ArcGis Android(安卓)10.2.6更新文档翻译
  10. Android(安卓)存储选项之 SQLite 优化那