標籤:
對於·app多個介面管理,如果一般使用Activity預設的載入模式,按返回鍵就會退回上一次操作,就是一種建立一個Activity執行個體。時間長了就會變得卡頓,一般人會選擇手動地在代碼中屏蔽返回鍵,使用app中開發的返回鍵,這樣也可以解決問題。
但是本質問題還是沒解決,不可能以後開發也用這樣的方法,用多了也煩躁。所以解決這個問題的關鍵在於瞭解Activity的載入模式。
第一中載入模式是:standard標準模式,系統預設的載入的模式
android:launchMode=“standard”
這種模式是系統的預設模式,一般開發app不需要更改。只要不安手機上的物理按鍵返回鍵back鍵。
這種載入模式的原理是開啟app第一個介面時,為app建立一個Task來管理app的開啟的Activity,每次操作都會建立一個新的執行個體Activty,同時也包括返回。所以如果你按手機上的物理按鍵back鍵後,會依次返回你之前的操作,知道app的第一個執行個體化得Activty。如果在app中操作太多,建立的Activity執行個體也會變得很多,如果大量操作的話,會出現卡頓的現象,也有可能出現記憶體溢出導致手機應用程式掛掉。
第二種載入模式是:singleTop模式
這種模式與standard標準模式相似,但不同的是這種模式如果開啟的Activty位於棧頂的話,就不會重新執行個體化Activty,不管操作多少次都不會改變介面上的程式體驗。
如果在任務棧頂沒有要開啟的Activty的話,就會建立新的Actvity載入到棧頂——此時與與standard標準模式完全相同。
第三種載入模式是:singleTask模式
這種載入模式在一個任務棧Task中只有一個Activty,不會重複地建立任務棧裡有的Activty執行個體的。這種模式有三類情況
(1)如果將要啟動的目標Activity沒有在任務棧中且不位於棧頂的話,就會重新執行個體化Activty載入到棧頂。
(2)如果將要啟動的目標Activity位於棧頂的話,此時與singleTop模式載入模式一樣
(3)如果將要啟動的目標Activity存在任務棧,但是又不在棧頂的話,系統會將任務棧內處於目標以上的所有Activty都一處,直到目標Activty暴露在棧頂。
第四種載入模式;singleInstance模式:
在這種載入模式下,不管目標Activity位於哪個Task任務棧,只會建立一個執行個體Activity。這種模式分為倆種情況:
(1)如果將要啟動的目標Activty不存在,系統會建立一個全新的任務棧Activty再建立目標Activty執行個體,並將其加入棧頂。
(2)如果將要啟動的執行個體Activity存在,無論它位於哪個應用程式中,位於哪個任務棧Task,系統都會將目標執行個體Activity轉到前台,就是棧頂,從而使該目標Activity顯示出來
注意:採用singleInstance模式載入Activity總是位於棧頂,且採用singleInstance模式載入的Activity所在Task將只包含該Activity
回到之前的所說的問題,屏蔽物理按鍵顯然不是個好方法。所以折中的辦法是將Activity的載入模式稍微改一下。將載入模式標準的standard模式改為singleTask模式,此時前面的問題迎刃而解。物理按鍵和app返回操作都有效,而且也不會出現大量操作卡頓的現象。看似問題解決了,但是有一個問題就來了,也就是標題的問題,使用帶返回值的intent操作不管怎麼弄返回的資料都為空白,而且app會出現典型的問題應用程式無響應。
通過Android的Activity載入模式可以看到,singleTask模式載入Activity執行個體,當任務棧的目標Activity執行個體不在棧頂時,系統會移除目標上面的所有Activity執行個體,從而是目標轉為前台,但是之前的棧頂的要返回的Activity以及不存在了,返回到第一張介面找不到第二張介面返回的資料,所以返回資料為空白,而且onActivityResult()中的資料擷取異常,導致程式掛掉,至此問題找到了,所以可以把第二張介面的載入模式設為singleTop模式。至此,問題解決了。但是,仔細想一下,如果再次按返回鍵的話,應該也會將第二張介面重複地執行個體化多次,不過按返回鍵不會出現標準模式下的操作返回模式。只不過第二張介面在應用程式不退出的情況下,仍然會重複地建立第二張介面,不過不會影響返回鍵操作。所以這點小小瑕疵還是能夠允許的。到此為止,一路上的問題都解決了。
android onActivityResult()接收返回資料為null的解決方案