Android singleTask 和singleInstance的区别

上周三去了网易面试被问到了这个问题,当时没有回答正确,回来以后特地写了一个程序研究一下。

关于Android activity的启动模式一共有四种 standard singleTop singleTask singleInstance 这四种

standard 和singleTop都比较好理解,这里主要研究一下 singleTask singleInstance的区别

首先是:singleTask

假设有两个Activity 分别是A 和 B ,Activity A的启动模式是standard Activity B的启动模式是singleTask, A中可以启动B,同时B中也可以启动A

通过A 启动B ,可以发现 A B的taskId是相同的,说明A和B运行在同一个栈里面,然后通过B启动A 此时的A也是在这个栈里,现在这个栈里从栈底到栈顶的顺序依次是 A—B—A,之后通过A再次启动B这个时候B的lanchMode就起作用了。通过测试发现 栈里不会产生新的B的实例,以前的时候起总以为栈里是这样的 A—A—B (ps:当时 面试的时候我就是这样回答的)实际运行结果是 A—B 中间的A直接被销毁了。

接着是:singleInstance

假设有两个Activity 分别是A 和 B ,Activity A的启动模式是standard Activity B的启动模式是singleInstance, A中可以启动B,同时B中也可以启动A

通过A启动B,可以发现A B的taskId是不相同的,说明A启动B的时候产生了一个新的栈,B运行在一个新的栈里面,时候通过B再次启动A  现在两个栈里面的情况分别是 这样的,原来的栈:A—A 新的栈:B

然后通过A再次启动B可以发现在新的栈里并没有产生新的B的实例  新的栈依旧是:B 只不过B被显示到了最前面;

总结:singleTask 和singleInstance的区别是:singleTask不会产生新的栈, singleInstance第一次调用的时候则会产生新的栈, singleTask模式下 如果原来的栈里已经存在要调用的Activity的实例,下次调用的时候会销毁中间所有的Activity。

时间: 2024-08-10 21:30:36

Android singleTask 和singleInstance的区别的相关文章

Android启动activity的4种模式(standard、singleTop、singleTask、singleINstance) ..

在AndroidManifest.xml中配置activity时,android:launchMode属性会指定启动activity的模式,有四种: standard singleTop singleTask singleInstance 这四种模式一般配合Intent属性变量FLAG_ACTIVITY_XXX使用,比如FLAG_ACTIVITY_NEW_TASK,本文暂时撇开FLAG_ACTIVITY_XXX,只讨论这四种模式的启动结果,先考虑只在同一个应用下的情况. standard模式 系

我对standard、singleTop、singleTask和singleInstance四种Activity启动模式的理解

之前自学android的时候,单从视频和书本上对这四种启动模式仅仅有了初步的字面上的理解.最近实战了下,也对这四种启动模式有了比较清晰的概念. 首先说下什么是Activity,按照我的理解,我们在手机上看到的每一个页面都是一个Activity,包括系统的桌面,也是一个Activity. 要启动一个Activity有四种模式:standard(标准启动模式).singleTop.singleTask.singleInstance. 注: Aty1_1和Aty2_1为两个不同的Activity,At

Android SingleTask 探究

Android 4种启动模式来说,用法说明此处不再提及主要介绍SingleTop,SingleTask相关的问题 说明 先分析 官方文档 中的一段话: As shown in the table above, standard is the default mode and is appropriate for most types of activities. SingleTop is also a common and useful launch mode for many types of

android 适配器simpleadapter和baseadapter区别

android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. adapter 是适配器模式,是数据和界面之间的桥梁.baseadapter 是一个抽象的类,要使用必需为其定义子类并实现相关方法.simpleadapter 派生于 baseadapter ,已经实现了相关的方法,所以可以直接使用.二者在使用效果上没有太大的区别,两者可以设计出几乎一模一样的界面.但在

Android getMeasuredHeight()与getHeight()的区别

public final int getMeasuredHeight () Added in API level 1 Like getMeasuredHeightAndState(), but only returns the raw width component (that is the result is masked by MEASURED_SIZE_MASK). Returns The raw measured height of this view. public final int

java的String和android的String有什么区别?

这是今天阿里电话面试被问到的,在之前确实没有想过(一直以为是一样的),于是面试完之后,我马上打开了源码,对这两个String类进行了比较,下面是我的发现. 首先我观察了这两个String类所导入的包,发现两者有些差异: 这是android版本: import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffe

Android Message和obtainMessage的区别

前几天需要实现一个以太网功能就看了以太网的源码部分,看见了源码部分在消息处理时,发现有一些不同的地方: 平时我在处理消息时: 1.首先创建Handler对象: private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 0: break; default: break; } }; }; 2.然后是消息处理: private void TestH

Android中@id与@+id区别

近日升级adt21+后,在输出apk时碰到编译layout异常,看了下是因为有人在layout引用一个不存在的resID时用了 @+id/xxx,而不是@id/xxx,导致debug编译器没显示错误,而在打包时的编译器出现错误,adt21-则没有此问题. 附上配图说明: Android中@id与@+id区别 : Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等

Android - match_parent 和 fill_parent的区别

Android - match_parent 和 fill_parent的区别 本文地址: http://blog.csdn.net/caroline_wendy match_parent 和 fill_parent的用法相同, 其实是完全一样的. API版本不同,推荐使用match_parent(API Level 8+).