Android 深入探讨sigleTask和singletop的区别

 我来答
huanglenzhi
2015-02-16 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517195
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

  1.singleTask和singletop都是保真了Activity在栈中的唯一性

  2.singleTask和singleTop实例存在时,都不会重新创建 new task

  不同之处有如下几点:

  如果singleTask启动的ActivityA位于栈底,在栈顶startActivity到这个ActivityA时会调动
onNewIntent->onStart->onResume。

  但singleTask启动的的ActivityA不存在时,会重新创建ActivityA,调用方式OnCreate->OnStart->OnResume

  2.如果singletop启动的ActivityB在栈底时,在栈顶startActivity到这个ActivityB时会重新调动
onCreate->onStart->onResume,但不会调用OnDestroy

  并且singletop启动的的ActivityB不存在时,会重新创建ActivityB,调用方式OnCreate->OnStart->OnResume

  3.singleTask在栈底时,从栈顶startActivity到栈底ActivityA,那么该栈startActivity的发起者的中间部分Activity会被销毁。而singletop是逐级跳跃到栈顶

  singleTask

  singletop

  追加一点singleInstance,虽然也是保证唯一性,但改模式的Activity是全局性的唯一性,生命周期和应用程序相同,不能及时回收,此外的话Activity在MVC充当Controller的角色,

  这点显然对singleIntance来说不适合,因此不建议使用。

  4.singleTask不适合充当ChildActivity,但singletop适合

  5.对作业栈,默认情况下,没有任何影响,因为栈的taskid是相同的,可以获取getTaskid(),默认情况下每个activity的taskid相同

  但是,如果自定义了栈的标签(这个标签相同的singletask activity在同一个作业栈中),那么taskid就会初选差别

  android:taskAffinity="com.sample.lanchmode.tester.main",那么一旦另一个作业栈被销毁,下次必然重建(相信我,这不是废话)。

  为了一句不是废话,我需要来证明一下。

  当我们的初始加载WelcomeActivity界面--->HomeActivity界面时,如果将HomeActivity的启动模式设置为sigleTask+android:taskAffinity="自定义(一般是类名)",

  ①那么WelcomeActivity销毁后,在到达HomeActivity之后,HomeActivity回作为一个新的作业栈栈底而存在,所以由HomeActivity启动的Activity的TaskId和HomeActivity相同。

  ②这个过程,WelcomeActivity和HomeActivity的TaskId是不相同的,问题出现了,当我们按下 Home键,然后在点击桌面上的app图标你会发现,WelcomeActivity再次出现了,

  而且再次进入了HomeActivity,并且这个HomeActivity调用了OnNewIntent,却没掉用OnCreate,所以来说他一直存在这,但你需要再次过渡才能找到它。

  (对于追求捕获Home键让app退出的读者是一个喜讯,这样可以做到每次Home之后都能再次进入登录界面),在这个过程中没有直接进入HomeActivity,而是WelcomeActivity(有人说不对么,不应该是这样么,在这里不想解释)。

  注意,使用了不同作业栈的Activity,会在最近打开的app显示一个应用会出现2个界面。

  在这里,需要强调一下singleTask+android:taskAffinity不一定必须使用,请依据需求而定,网上有人推荐使用,但我却想说,不要盲目,并不是所有的应用都适合。

  1-->
 singleTask+android:taskAffinity对于效率而言,优势并不存在,比如设置进程的,但对于带有登录状态的app需要慎用,否则造成信息泄露等问题,开发中只使用singleTask即可。

  2-->
 singleTask+android:taskAffinity适用于单用户保密性的app(可做到Home之后下次必须登录才能查看信息),建议在这方面试试。

  转载

Storm代理
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企... 点击进入详情页
本回答由Storm代理提供
QQMSD8
2015-10-19 · 知道合伙人软件行家
QQMSD8
知道合伙人软件行家
采纳数:6788 获赞数:13239
没有做不到,只有想不到,帮助别人的同时也是对自己的提升

向TA提问 私信TA
展开全部
sigleTask和singletop是Android的启动模式,Activity的四种launchMode分别是:
1.standard
2.singleTop
3.singleTask
4.singleInstance

以下是对四种launchMode的描述及区别:
1.standard
standard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。

2.singleTop

在上面的基础上为<activity>指定属性android:launchMode="singleTop",系统就会按照singleTop启动模式处理跳转行为。singleTop启动模式,如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。

3.singleTask

在上面的基础上修改FActivity的属性android:launchMode="singleTask"。singleTask模式,如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。

4.singleInstance

这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式