天天看點

解決點選laucher應用重新開機的解決方案

背景描述:

最近項目中遇到一個問題,就是在某手機上,每次點選桌面的APP圖示,APP都會重新從laucher進行一次從歡迎頁面的重新啟動。剛開始以為是Activity啟動方式的問題,後來試了一下,發現貌似不是這個問題,于是我搜尋是不是Application的問題,終于讓我發現了解決方案。

解決方案:

在application中有一個屬性叫

android:allowTaskReparenting=”true”

這裡解釋一下這個屬性的作用:

這個屬性用于設定Activity能夠從啟動它的任務中轉移到另一個與啟動它的任務有親緣關系的任務中,轉移時機是在這個有親緣關系的任務被帶到前台的時候。如果設定了true,則能夠轉移,如果設定了false,則這個Activity必須要保留在啟動它的那個任務中。

如果這個屬性沒有設定,那麼其對應的元素的allowTaskReparenting屬性值就會應用到這個Activity上。它的預設值是false。

通常,當Activity被啟動時,它會跟啟動它的任務關聯,并它的整個生命周期都會保持在那個任務中。但是當Activity的目前任務不在顯示時,可以使用這個屬性來強制Activity轉移到與目前任務有親緣關系的任務中。這種情況的典型應用是把應用程式的Activity轉移到與這個應用程式相關聯的主任務中。

例如,如果一個電子郵件消息中包含了一個網頁的連結,點選這個連結會啟動一個顯示這個網頁的Activity。但是,由e-mail任務部分啟動的這個Activity是由浏覽器應用程式定義的。如果把它放到浏覽器的任務中,那麼在浏覽器下次啟動到前台時,這個網頁會被顯示,并且在e-mail任務再次顯示時,這個Activity有會消失。

Activity的親緣關系是由taskAffinity屬性定義的。通過讀取任務的根Activity的親緣關系來判斷任務的親緣關系。是以,通過定義,任務中的根Activity與任務有着相同的親緣關系。是以帶有singleTask或singleInstance啟動模式的Activity隻能是任務的根節點,Activity的任務歸屬受限于standard和singleTop模式。

是不是覺得很繞口,那就簡單說,一個activity原來屬于task1,但是task2啟動時,activity1可能不屬于task1了,而屬于task2,這就是allowTaskReparenting的作用。

這裡我們還需要對Android的affinity進行一些解釋

這裡參考以下資源大家了解:

Android Application Task Activities的關系

Android之affinity