天天看點

如何防止使用singleInstance的activity傳回時拉起其他應用的問題

最近項目有一個需求,簡單的說就是一個activityA拉起可以聊天的網頁activityB,B有兩種傳回方式第一種是傳回到A,但是下次再從A進入B時保持通路以及會話狀态,另一種傳回是徹底關掉這個aictiviy。

遇到這樣的需求那麼做到這樣的需求首先想到的就是使用activity的singleInstance模式,将B啟動在另一個棧中,這樣如果當由B跳轉到A時,B可以選擇finish掉自己,也可以保留自己的狀态。具體的實作是A startActivity 跳轉到B,B有兩種方式傳回A,第一種是finish掉自己,另一種是通過startActivity方式在啟動A,這樣A再次進到B的時候,B由于沒finish掉自己,是以B的會話狀态還在,還可以接着之前的對話繼續聊天。

那麼接下來問題來了,在測試的時候發現了一個現象,如果在請我的應用之前如果有其他應用按home退在背景,那麼如果從B以startActivity的形式傳回到A,A先finishB再finish掉自己的時候,會把隐藏在背景的應用再次拉起來。

這個現象就很奇怪,為什麼退出自己的應用會把其他的應用拉起來呢?

大家可以先看看http://blog.csdn.net/liuhe688/article/details/6754323/這個文章了解下activity的幾種模式,再回過頭來看着問題就好解釋了。

因為A啟動B,B跳轉會A的方式也是啟動,那麼如果正常情況下,A finish掉自己的之後,就會把B拉起來,因為程序中隻剩下B了;如果A在finish自己之前先finishB,再finish自己,那麼Afinish掉後本應怪會去B所在的棧去找activity,但是由于B被finish掉了,是以隻能往前找,找到了之前在背景的應用,然後拉了起來。

那麼問題該如何解決呢?

moveTaskToBack(),對,也許有心的朋友看到了,B在傳回A的時候我使用了startActivity的方式,那麼這樣B所在的棧相當于藏在了A的後邊,如果使用moveTaskToBack()方式,相當于把B所在的棧放到了棧隊列的後邊,同時也能拉起原來的A,這樣A在傳回的時候既不能拉起B,也不會跳到其他頁面了