對SingleTask和TaskAffinity的理解

最近研究微信調起自己客戶端的事情,對於SingleTask和TaskAffinity的理解又多瞭一些理解。

 

以前對於Android的四種LaunchMode有一些瞭解,其中比較有意思的就是SingleTask和SingleInstance 。(四種LaunchMode的瞭解可以參見這篇文章,對於Activity棧的講述很詳細)。這兩種LaunchMode的理解都跟Task有很大關系。

 

        一個Task可以理解成一個Activtiy棧,可以裝載一個或者多個Activity,回退和打開的順序邏輯和基本的數據結構棧是一致的。下面的這段話非常關鍵:那就是,一個Application如果有N個Activity,這些Activity分佈在M個Task中,那麼Application的回退棧會遵循這樣的原則,首先從當前Acitivty在的Task回退,直到這個Task中再無記錄;那麼會尋找下一個Task再次回退直到沒有Activity(這個Task是怎麼尋找的呢,其實Task在Appliction的總棧中也是有記載的,總是TasK中最近使用的Activity相關)。

 

 

       下面是我對這兩種比較難的LaunchMode的理解。

 

       一 . SingleTask這個LaunchMode建議和TaskAffinity一起使用,這樣才能發揮這種加載模式的特殊邏輯效果。當一個應用程序加載一個singleTask模式的Activity時,首先該Activity會檢查是否存在與它的taskAffinity相同的Task。 

    1、如果存在,那麼檢查是否實例化,如果已經實例化,那麼銷毀在該Activity以上的Activity並調用onNewIntent。如果沒有實例化,那麼該Activity實例化並入棧。 

    2、如果不存在,那麼就重新創建Task,並入棧。 

 

 

 

   二. 1、當一個應用程序加載一個singleInstance模式的Activity時,如果該Activity沒有被實例化,那麼就重新創建一個Task,並入棧,如果已經被實例化,那麼就調用該Activity的onNewIntent; 

    2、singleInstance的Activity所在的Task不允許存在其他Activity,任何從該Activity加載的其它Actiivty(假設為Activity2)都會被放入其它的Task中,如果存在與Activity2相同affinity的Task,則在該Task內創建Activity2。如果不存在,則重新生成新的Task並入棧。

 

         以上這些學習都是因為最近在做一個微信調起客戶端的事情。如果自己的客戶端處於運行狀態,按下Home鍵後臺掛起。此時如果使用微信調起自己的客戶端某個頁面,不做任何處理的情況下,按下回退或者當前Activity.finish(),頁面都會停留在自己的客戶端(因為自己的Application回退棧不為空),這明顯不符合邏輯的。產品的要求是,回退必須回到微信客戶端,而且要保證不殺死自己的Application.我的處理方案就是,設置當前被調起Activity的屬性為:

 

LaunchMode=""SingleTask"  taskAffinity="com.tencent.mm"(com.tencent.mm是借助於工具找到的微信包名),就是把自己的Activity放到微信默認的Task棧裡面,這樣回退時就會遵循“Task隻要有Activity一定從本Task剩餘Activity回退"的原則,不會回到自己的客戶端;而且也不會影響自己客戶端本來的Activity和Task邏輯。

 

 

發佈留言