假设我们有两个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,