技术小故事-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 进入它所在的栈。

 所以刚果的过程为:

IMG_20151020_225451

所以看到:启动 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 只能出栈啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章