2016-02-20 73 views
7

我遇到了2種不同的類型,讓我的活動基於一些參數運行。第一個是savedInstanceState,另一個是getIntent.getExtras()savedInstanceState vs getIntent()。getExtras()

Q1) 所以我不明白的是,一旦我通過我的活動,然後啓動它,它應該有捆綁。 但是,如果由於某種原因再次重新創建活動,它應該再次具有相同的包。 (我是對吧?)

Q2)基於Q1爲真的事實,以及事實上,我不能只是在活動已經開始時重寫包,我猜如果由於某種原因我已經開始活動,我想改變一些束的參數,我應該創建一些活動領域,並在我的活動生活中使用這些領域。 並重寫saveInstanseState來保存新的字段,如果由於某種原因我的活動將被重新創建。這是真的嗎?

Q3)基於這樣的事實,所有上述是真實的,在的onCreate()應在Android的世界每一個活動需要像這樣開頭:

if (savedInstanceState != null) { 
    mType = savedInstanceState.getInt("some_val1"); 
    mCardId = savedInstanceState.getLong("some_val2"); 
    mQuery = savedInstanceState.getString("some_val3"); 
    mCategory = savedInstanceState.getLong("some_val4");; 
} else { 
    mType = getIntent().getExtras().getInt("some_val1"); 
    mCardId = getIntent().getExtras().getLong("some_val2"); 
    mQuery = getIntent().getExtras().getString("some_val3"); 
    mCategory = getIntent().getExtras().getString("some_val4"); 
} 

Q4)假設的onSaveInstanceState被稱爲和保存值與開始活動的原始包(getIntent.getExtras)不同,如果再次重新創建活動,這是否意味着saveInstanceState與getIntent.getExtras()不同?或者它們現在相同? (如果它們是相同的,那麼上面的代碼中的if/else沒有真正的含義,因爲它是相同的!)。如果我沒有覆蓋onSaveInstanceState,但是當我創建活動時,我將它傳遞給一個Bundle,這是否仍然意味着如果活動再次重新創建,我可以獲得我的原始包? (我猜這個問題會根據其他答案回答自己)

回答

6

getIntent().getExtras()savedInstanceState之間的主要區別是它們有不同的用法。其意圖是在活動之間進行通信,而保存的狀態用於當您離開活動時用戶界面的當前狀態,例如通過按主頁按鈕。所以它會保存你的ListView的位置和類似的值或未保存的TextEdit s的值。

問題1:是的,一般情況下,信息不應該丟失,只要您不要再次打開該活動。 Q2:到目前爲止確實如此。默認視圖將保存它們的狀態,所以你不需要自己做。但是,如果您的活動第二次使用不同的包開始,您將獲得新值。

問題3:沒有必要,這取決於您的用例,但不會破壞任何內容。重點是當你從互聯網上加載日期,你將不得不等待一次,在第二次onCreate()調用數據將被恢復(如果你在UI元素中顯示他們與ID!)。

Q4:意圖將是初始值,而保存的狀態是值的修改狀態。

問題5:一般來說應該是一樣的。由於基本的UI元素將默認保存它們的狀態。

保存狀態的要點是保持UI更改,即使您的應用程序在後臺被銷燬。因此,即使您的應用程序不再存儲在您的設備內存中,您的應用程序仍然會在該位置恢復。

相關問題