FLAG_ACTIVITY_NEW_TASK和SingleInstance的設計思路(多task的應用)


這部分的想法都是基於以下兩點:

1.Activity可能被復用,可能是復用Activity的功能,還可能是復用Activity的狀態;

2.Task的作用:target,同一個task中的Activity服務於相同的或者接近的目標(target)。

(一個task的目標往往由task的root Activity決定,因為是root Activity造就了這個task)。

 

Activity復用情景1

在當前App中,通過Intent,打開了當前App或其他App的一個Activity(standard或singleTop),則這個Activity變成當前task的一部分。

即:在當前task中打開了一個activity

使用理由:

為了完成task的目標,需要新的Activity的完全參與進來,需要它成為task的一部分,可以這樣子復用;

 

Activity復用情景2

在當前App中,通過Intent,使用FLAG_ACTIVITY_NEW_TASK打開了當前App(新Activity的task_affinity與當前app中其他Activity不同)或其他App的一個Activity(非singleInstance),

1. 假如這個Activity沒有被打開過,且沒有一個task的affinity與這個Activity相同,則這個Activity變為新的task的root Activity,創建了一個新的task。

2. 如果有其他的task的affinity與這個Activity相同,則會將舊的task調起,將這個Activity在這個task中打開,

3.假如這個Activity已經被打開過,則會將舊的task調起,如果配合FLAG_ACTIVITY_CLEAR_TOP標簽,新的Activity以上的Activity會被銷毀,也就是打開了一個全新的Activity以供復用。

4. 如果要打開的Activity為singleTask,不論有沒有加FLAG_ACTIVITY_CLEAR_TOP標簽,都有上層Activity出棧的效果。

以上四種情況都可以歸納為在新的task中打開了要復用的Activity

使用理由:

為了完成task的目標,需要用到新的Activity,但是這個Activity的功能,與原來task的目標有一定差距,體驗上是一個新的功能,則需要創建一個獨立的task,在這個task完成它的任務后,舊的task可能就不關心這個task了(比如新的task中的activity只是顯示一個通知,讓用戶看一眼,看完就可以不管),或者,新的Activity不應該過度參與到舊的task中,(比如通知看完了就不應該再存在在task中),這種情況下就可以這樣復用。

 

與第一種復用情形還有一個區別,這個Task中的Activity在被銷毀前是可以被其他task重用的。

 

Activity復用情景3

在當前App中,通過Intent,打開了一個SingleInstance的Activity,會創建一個新的task,且新的task中永遠只有一個Activity。

使用理由:

與復用情形2一樣,因為新的Activity的功能與原來的task的目標有一定差距,所以不能視為同一個task,所以要在新的task中打開這個Activity。

但與情形2不同的是,情形2中,舊的task不關心打開的新Activity,但打開的新Activity所在的task,可以繼續創建Activity為新task的目標服務(比如添加附件功能)。

 

而在情形3中,新的task只有一個目標,就是發揮當前Activity的功能。不願過多地執行更多功能,就需要使用singleInstance的模式。(比如打電話就是純粹的打電話,打完電話該做什么不是打電話所在的這個task該關心的)

另一方面,新的task在被復用的時候,不會增加Activity,也可以保證其他task重用這個task的時候,不會受到其他task復用時新增Activity的影響

 

情形2和情形3使得創建后的Activity可以被復用,節省了創建時的開銷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM