技術小故事-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 只能出棧啦。

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