Activity Task Stack

本文深入探讨了Android中Activity的四种加载模式:standard、singleTop、singleTask和singleInstance的特点及区别,尤其关注它们在不同场景下的行为表现。

去音悦台面试,面试官深入的问了activity的四种加载模式的问题。

我们知道,这四种加载模式分别是:standard singleTask singleTop singleInstance

这些加载模式分为两大组

standard和singleTop为一组:这两种加载模式 activity 可以多次实例化 这些加载的实例可以属于任何一个task以及activity stack的任何地方。这两种模式不同之处只有一个地方,当standard的activity每次有一个new intent请求的时候,一个新的实例会创建来响应这个intent。每一个instance应对一单独的intent。singleTop的activity与之类似。

然而,如果目标task已经存在一个instance在它对应栈的顶端(top),在栈顶端的instance会收到这个新intent。不会起新的实例。此时此activity的onNewIntent()方法会触发。


singleTask和singleInstance为一组:这两种只能开启一个task(can only begin a task),他们常常处在activity stack的根部(最底部),此外,设备只能拥有一个一个这样的activity实例在同一时间,只有一个这样的task。他们的不同之处在于,singleTask允许其他的activity在它的task中(这些activity必须的stanard和singleTop的),singleInstance则不允许。


其实我一直迷惑的是task到底是什么呢?

一个task是在执行某些任务时候与用户交互的activities的集合。这些activity被安排在一个stack中(“back stack”),按每个activity打开的顺序排列。

google并没有某些任务说成是某个应用。如果说我打开了好几个应用的activity,那task是不是指的就是这些activity的集合呢?


----------------------------------------------------------------------------------------------------------------------------------------

其实解释这4种模式问题不大

下面是面试官的问题:

singleTask的activity是怎样被调用的呢?

我的回答是当有一个intent的时候,若activity已经存在,则调用已存在的这个activity。

然后他接着问 为什么这样 ?

我没回答出来,按照面试官的意思是:因为存在一个stack中,google会把存在这个activity之上的别的activity出栈,这样这个activity就在栈顶了。我接着问,那出栈的activity会finish吗?面试官的回答是的。

回来之后认真思考了这个问题,我觉得这样是不对的。

google官方文档中有说,singleTask singleInstance的activity会开启一个task,并存在task的最底部。如果说上面有上百个activity,都finish的话,显然是不行的。


------------------------------------------------

面试官接着问,栈与栈之间如何通信?

我瞬间就懵了,想了一下,说不知道。


面试官接着说,栈栈之间通信就是进程与进程的通信。

我不淡定了。

我问singleInstance的activity会起一个新的进程?

他说是的

我说我认为不会

他说回去后可以试试

我回来试试了,这样是不对的,起的activity都在一个进程中。

------------------------------------------------------------------

通过这次面试,加深了对了这4种加载模式的理解

在一个进程中,应该会有不止一个task,就是不同的stack。

有没有对这方面理解的高手,还望解答









评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值