技术小故事-Activity的Launch Mode引起的动画“疑案”
前两天同事在做我们的App注册页面的的时候碰到了这样的一个场景:在注册过程中有这样的一个流程,进入页面(Activity)A,完成输入,再进入页面 B,完成输入,最后在进入页面C;即A-》B-》C。现在问题来了,在 C 中有一个验证逻辑:如果验证成功直接从C挑战到A,同时要干掉B ;如果验证失败,则从 C 中可以依次次back到B到A,同事问我有没有好点的办法?我告诉他可以去看看 Activity 的 Launch Mode 这部分知识看看能不能解决问题。
过一会儿,他又带着新问题过来了:A-》B,的切换动画都实效了,B-》C 的动画正常,我们个每个Activity设置的切换动画是右进左出,现在变成了下进上出了,原因是他设置了 A 的 Luanch Mode 为 signleInstance ,即:android:launchMode="singleInstance"。这是为什么?你想到原因了吗?
还原事件经过:原因是我的同事想通过 Luanch Mode 的使用实现上面的问题结果因为没分清 singleInstance 和 singleTask 这两个属性的区别造成了上面的现象。先来分析想造成上面动画实效的原因吧?
singleInstance:启动模式被指定为 singleInstance 的 Activity ,只能以单例的形式存在 Task 中,并且霸道的独享一个 Task ,不允许其他 Activity 进入它所在的栈。
所以刚果的过程为:
所以看到:启动 A 之后系统为 A 创建了一个 Task1 ,然后启动 B 应为不能把 B 放到 A 所以在的 Task1 中,所以系统再创建一个 Task2 ,把 B 放到 Task2 中,并且把 Task2 加到 Task1 之上,注意这句话,所以我们这时看到的其实是Task1-》Task2 的切换动画,所以刚果看到的下进上出这个动画正好是系统的Task切换动画。接着启动 C ,直接把C放入 Task2 中和 B 子在一个 task 里。
那么怎么解决,同事的第一个问题?
singleTask:启动模式被设置成 singleTask 的 Activity ,在一个 Task 只允许存在一个实例 ,它没有 singleInstance 那么霸道,singleTask 允许它所在的 task 里存在其他Activity。
我们可以利用 singleTask 在一个 Task 只允许存在一个实例的这个特性,解决同事的第一个问题。将 A 设置成 singleTask,在 A-》B-》C之后栈的情况是:
然后在 C 中启动 A 之后栈的情况是:
因为 A 是在一个栈中不允许多实例 ,所以只能把 A 拉到栈顶,所以 B、C 只能出栈啦。