安卓四大启动模式之singleTask与singleInstance区别

引言:最近看到很多人说面试必问的安卓四大启动模式,说到启动模式大家都知道这四个启动模式 standard singleTop singleTask singleInstance 这四种,standard 和singleTop都很好理解,这里主要研究一下 singleTask singleInstance的区别,网上很多博主回答都是错误的或不全面的让人误导(主要是对singleTask singleInstance的各说风云)

说一下部分人的错误理解

singleTask(栈中单实例)启动

A、B、C 3个activity,A、B是默认启动模式,C为singleTask 模式,相继A->B->C->A->B->C ;

任务栈可能会有人理解成A-B-A-B-C 但其实是错误的

 真实的是:

 假设有两个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 (我以前也这样回答过)实际运行结果是 A—B 中间的A直接被销毁了。

singleInstance(全局单实例

(最初接触安卓的时候偷懒看一串解释理解成会将上面的所有实例销毁A、B相继启动到C的时候A都会被销毁仅剩B了)

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

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

运行结果是A-B-A-B-C

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

 

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

你可能感兴趣的:(基础知识)