將最近在開發中遇到的問題記錄下來,以避免重複再犯!android
----------------------------------------------------------------------------------------------------------------spa
問題:在碎片界面點擊按鈕「D」進入另外一活動E(Activity)後,再按回退鍵返回到碎片界面,按了回退鍵發現又重複進入活動E(Activity),即須要兩次才能回退到碎片界面。code
截圖以下:xml
「D」 「E」blog
緣由:點擊按鈕「D」後,活動「E」被重複建立了兩個實例。開發
解決方法:it
一、原理:在給出具體解決方法以前,先預習下「活動啓動模式」這個知識點,在實際項目中咱們應該根據具體的需求來爲每一個活動指定恰當的啓動模式。啓動模式一共有4種,分別是standard、singleTop、singleTask和singleInstance,能夠在AndroidManifest.xml中經過<activity>標籤指定android:launchMode屬性來選擇啓動模式。class
· standard模式(即默認狀況下),每當啓動一個新的活動,它就會在返回棧中入棧,並處於棧頂的位置。對於使用standard模式的活動,系統不會在意這個活動是否已經在返回棧中存在,每次啓動都會建立該活動的一個新的實例。原理
缺點:活動已經在棧頂,再次啓動的時候還要建立一個新的活動實例程序
· singleTop模式用來解決重複建立棧頂活動問題。在啓動活動時若是發現返回棧的棧頂已是該活動,則認爲直接使用它,不會再從新建立新的活動實例。
缺點:若是該活動並無處於棧頂位置,仍是可能會建立多個活動實例
· singleTask模式讓某個活動在整個應用程序的上下文中只存在一個實例。當活動指定爲singleTask,每次啓動該活動時系統首先會在返回棧中檢查是否存在該活動的實例,若是發現已經存在則直接使用該實例,並把在這個活動之上的全部活動通通出棧,若是沒有發現就會建立一個新的活動實例。
· singleInstance模式啓用一個新的返回棧來管理這個活動
二、具體方法:在AndroidManifest.xml中「E」活動下添加android:launchMode="singleTask"便可,具體以下:
<activity android:name=".Activity.EActivity" android:launchMode="singleTask"/>