2013-08-06 288 views
6

我有一個viewpager持有許多片段。當活動發送到後臺並且需要資源時,操作系統將終止應用程序或至少一些碎片。當我返回到活動時,它會崩潰,因爲活動試圖附加它在清理前保留的所有碎片的新實例,現在一些字段爲空。這當然可以通過使用Bundle正確實現狀態保存和恢復來解決,但我不想這樣做。 相反,我想防止恢復碎片。有沒有辦法告訴操作系統,一旦它發送了GC並破壞了碎片,它應該不會再打擾它們了嗎?一旦清理完成,我希望在返回時簡單地重新創建活動,就好像用戶通過點擊圖標啓動它一樣。有沒有這樣做的機會?Android防止恢復活動

此處提出的解決方案https://stackoverflow.com/a/15683289/552735不起作用。它會導致異常 java.lang.IllegalStateException:對於鍵f2,Fragement不再存在:index 3

+1

您是否試圖在持有fragents的activity的'onStop()'方法中添加'finish()'?它不會保存任何狀態。 –

+0

即使當我按回家按鈕時,每當它被髮送到後臺時都會終止該活動。這不是我想要的 - 我只希望操作系統停止重新創建所有破壞它們之前存在的碎片。據我所見,ViewPager具有自己的狀態恢復機制,這就是導致這些問題的原因。 – delegate

回答

8

我遇到了這樣的問題。以下是我固定它:

@Override 
    protected void onSaveInstanceState(Bundle savedInstanceState) 
    { 
     savedInstanceState.clear(); 
    } 

注意,此方法將確保絕對沒有UI狀態信息時,該活動是由系統終止將存儲 - 這個也沒有恢復任何意見時onRestoreInstanceState()得到效果在onStart()之後使用相同的捆綁包進行調用。

+2

這不是一個解決方案,這是症狀治療 – Roel

+1

如果恢復活動狀態不是關鍵或重要的,這是一個非常好的解決方案。這樣,整個活動再次被重新創建,一切正常。 –

0

您無法禁用保存/恢復實例狀態操作。如果你不想真正實現這個邏輯,你必須重新加載表單,特別是如果你的表單高度加載碎片。

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    startActivity(new Intent(this,YOUR_ACTIVITY.class)); 
    finish(); 
} 
+0

儘管此代碼可能會回答問題,但提供有關如何解決問題和/或解決問題原因的其他上下文會提高答案的長期價值。 – Badacadabra