在Android設計中遇到這樣一個問題:java
Activity A,在AndroidManifest.xml中設置它的一個<inter-filter>爲android
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
A的launchMode爲「singleTask」。spa
Activity B,設置launchMode爲「standard」。設計
這樣,A做爲啓動應用的入口Activity;在A中進行某個操做能夠跳轉到B。code
若是此時,點擊‘Home’鍵返回到Home Screen後,再次點擊應用圖標進入應用,出現的界面爲A,而非B。經過一些測試,發現,在從新進入應用時,在Back stack中,位於A之上的其餘Activity均被銷燬了。xml
開發的時候,因爲用到了singleTask用法不當,形成了一些沒必要要的麻煩,現總結以下:開發
現有Activity:A,B,C,D;啓動順序是A->B->C->D,其中,B是singleTask的。it
A到B後,A finish掉;B到C後,B不finish;C到D後,C不finish;在D啓動B,就能夠一會兒將C、D kill掉,只保留B。可是,io
這個時候你從B退出(整個程序退出了),長按Home鍵啓動,進來的第一個是B,而不是A,這就已經不對了; 並且, 剛纔就算你不退出,從B再進到C,按Home,再長按Home進入,回來的是B而不是C。
解決方案以下:
將singleTask改爲singleTop。
這樣以來,剛纔從D啓動B的時候,就要用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
也就是說,singleTask會自動執行clear top, 而singleTop須要手動;而從Home鍵啓動,若是是singleTask的話就自動clear top了,因此到不了想要到的Activity。
這樣就解決了問題,可是上面的說法是我的的理解。
至此,咱們總結一下,設置了"singleTask"啓動模式的Activity的特色:
1. 設置了"singleTask"啓動模式的Activity,它在啓動的時候,會先在系統中查找屬性值affinity等於它的屬性值 taskAffinity的任務存在;若是存在這樣的任務,它就會在這個任務中啓動,不然就會在新任務中啓動。所以,若是咱們想要設置 了"singleTask"啓動模式的Activity在新的任務中啓動,就要爲它設置一個獨立的taskAffinity屬性值。
2. 若是設置了"singleTask"啓動模式的Activity不是在新的任務中啓動時,它會在已有的任務中查看是否已經存在相應的Activity實 例,若是存在,就會把位於這個Activity實例上面的Activity所有結束掉,即最終這個Activity實例會位於任務的堆棧頂端中。