假设我们有两个Android Application他们分别是testA和testB。testA中只用一个activity名称为m,testB中含有三个activity分别是a、b和c。
(1) Application与thread:一对多。Application可以出现多个线程,但是在子线程里边不能去绘制UI,否则会出现异常。
(2) Application与stack:多对多。Application启动时创建一个stack_A。singleInstance对应的activity单独在一个stack_B中(有几个singleInstance类型的activity就会有几个stack与之对应)。
注意:“standard”和”singleTop”对应的activity和收到的 Intent的发送者在同一个stack内。
“singleTask”对应的activity永远都会在stack_A中(并且不像有的人说的那样它在stack的最底层),
“singleInstance”对应的activity单独在stack_B中,有且只有它自己。
证明:(1)start testB ——> a ——> b(加载类型singleInstance) ——> c ——> back键 ——> 我们看到了a
根据stack的特性先进后出,如果a、b、c在同一个sack中我们按back键之后应当看到的是b,但是事实是我们看到了 a,此现象可以证明a和c处于同一个stack而b单独在另一个stack中,所以一个Application可以对应多个stack。
(2)start testB ——> a
start testA ——> m ——> c ——> back键 ——> m
根据stack的特性先进后出可以得出,m和c在同一个stack中,而c是testB中的activity,所以一个stack可以对应多个Application。
(3) Application与task:多对多。因为一个task对应一个stack。
(4) Application与activity:一对多,这个没得说。
补充:singleInstance类型的activity具有LocalService的一些特性,例如:如果我们不把singleInstance类型的activity销毁,启动此activity的应用即便退出,此activity仍然处于onStop状态。销毁activity的方法有3中:一种是去调用onDestroy,一种是按back键让其退出stack,还有一种就是系统去销毁。所以有一种情况我们就可以做出合理的解释了:一个android应用没有任何service但是当退出主页面后,从后台仍然能看到此进程在运行,这就有可能是我们使用了singleInstance类型的activity而没有去销毁它导致的。
singleTask对应的activity永远都会在自已应用程序的默认stack中,不管谁去调用它。例如:start testB ——> a,然后start testA ——> m ——> b(加载类型singleTask)——>back键——>a;注意如果:start testB ——> a——>b(加载类型singleTask)——>c,然后start testA ——> m ——> b(此时c被销毁)——>back键(b被销毁)——>a,
学习Android,了解一些基本概念将有助更深入的去学习和理解Android。在这里,所要讲诉的是Android里三个比较基础的概念:Android Application、Activity Stack 和 Task。
1. 什么是Android Application?
Android Application就是一个android应用程序。 简单的理解就是一个apk就是一个Android Application。例如Android平台下自带的应用程序:Browser、Contacts、camera等。
每一个Application都是由Activity、Service、content Provider和Broadcast Receiver等Android的基本组件所组成,其中Activity是实现应用程序的主体,它承担了大量的显示和交互工作,甚至可以理解为一个界面 就是一个Activity。
2. 什么是Activity Stack?
如上所诉,Activity承担了大量的显示和交互工作,从某种角度上将,我们看见的应用程序就是许多个Activity的组合。为了让这许多 Activity协同工作而不至于产生混乱,Android平台设计了一种堆栈机制用于管理Activity,其遵循先进后出的原则,系统总是显示位于栈 顶的Activity,从逻辑上将,位于栈顶的Activity也就是最后打开的Activity,这也是符合逻辑的。
在操作应用程序时,每次启动新的Activity,都会将此压入Activity Stack,当用户执行返回操作时,移除Activity Stack顶上的Activity,这样就实现了返回上一个Activty的功能。直到用户一直返回到Home Screen,这时候可以理解为移除了Activity Stack所有的Activity,这个Activity Stack不再存在,应用程序也结束了运行。
3. 什么是Task?
Task是指将相关的Activity组合到一起,以Activity Stack的方式进行管理。从用户体验上讲,一个“应用程序”就是一个Task,但是从根本上讲,一个Task是可以有一个或多个Android Application组成的。例如:你想在发送短信时,拍一张照并作为彩信发出去,这时你首先停留在短信应用程序的的Acitivity上,然后跳转到 Camera应用程序的Activity上,当完成拍照功能后,再返回到短信应用程序的Activity。这实际上是两个Android Application协同合作后完成的工作,但为了更好的用户体验,Android平台加入了Task这么一种机制,让用户没有感觉到应用的中断,让用 户感觉在一“应用程序”里就完成了想完成的工作。