2013-05-30 14 views
1

我有兩個活動:PictureList和AddPictures。從PictureList我請求活動的結果是這樣的活動:onActivityResult在返回後沒有得到正確的結果,因爲調用它的活動已重新創建?

Intent myIntent = new Intent(PictureList.this, AddPictures.class); 
Bundle b = new Bundle(); 
b.putInt("iEntry", clickCounter); 
b.putBoolean("bAddPicture", true); 
b.putBoolean("bEditPicture", false); 
myIntent.putExtras(b); 
startActivityForResult(myIntent,1); 

我也實施相應的onActivityResult這裏:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
     if(resultCode == RESULT_OK){   
      iReturnedEntry = data.getIntExtra("iReturnedEntry", 0); 
     } 
     if (resultCode == RESULT_CANCELED) {  
     } 
     } 
    } 
} 

在其他活動,AddPictures,接收參數:

Bundle b = getIntent().getExtras(); 
iEntry = b.getInt("iEntry"); 
bAddPicture = b.getBoolean("bAddPicture", false); 
bEditPicture = b.getBoolean("bEditPicture", false); 

,當它返回它確實是這樣的:

Intent returnIntent = new Intent(); 
returnIntent.putExtra("iReturnedEntry", iEntry); 
setResult(RESULT_OK,returnIntent);  

通常情況下,應用程序可以正常工作,但通常會發生結果未被存儲。我認爲,由於某些內存管理或其他原因,PictureList活動正在重新創建,或者從活動AddPictures返回後再次調用onCreate方法,因此onActivityResult不起作用。我該如何解決這個問題?

回答

1

如果從另一個活動等待結果的最好的事情是保存參數共享偏好,然後在的onResume加載它們早在以前的活動。以這種方式,由於包含onActivityResult的活動的重新創建,數據不會丟失。

然後,對於第一個活動PictureList,代碼變成這樣:

bPictureRequested = true; 
bPictureReceived = false; 
appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
preferencesEditor = appSharedPreferences.edit(); 
preferencesEditor.putBoolean("bPictureReceived", bPictureReceived); 
preferencesEditor.commit(); 

Intent myIntent = new Intent(PictureList.this, AddPictures.class); 
Bundle b = new Bundle(); 
b.putInt("iEntry", clickCounter); 
b.putBoolean("bAddPicture", true); 
b.putBoolean("bEditPicture", false); 
myIntent.putExtras(b); 
startActivity(myIntent); 

進入的onResume我加了以下幾行,以獲得結果:

if(bPictureRequested){ 
     appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
     bPictureReceived = appSharedPreferences.getBoolean("bPictureReceived", false); 
     if(bPictureReceived){ 
       iReturnedEntry = appSharedPreferences.getInt("iReturnedEntry", 0); 
       // Reset the flags 
       bPictureRequested = false; 
       bPictureReceived = false; 
       preferencesEditor = appSharedPreferences.edit(); 
       preferencesEditor.putBoolean("bPictureReceived", bPictureReceived); 
       preferencesEditor.commit(); 
     } 
} 

現在,另一個活動AddPictures I留下了相同的部分,它通過值獲取之前的參數,但改變了它使用共享偏好修改數據的方式:

appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
preferencesEditor = appSharedPreferences.edit(); 
preferencesEditor.putBoolean("bPictureReceived", true); 
preferencesEditor.putInt("iReturnedEntry", iEntry); 
preferencesEditor.commit(); 
finish(); 

現在一切工作正常。

0

是的,活動可以通過Android重新創建,通常是因爲它在活動暫停時需要內存。

閱讀活動生命週期here,並使用onPause()和onResume()方法保存和恢復您的PictureList活動的狀態,因爲活動被暫停和恢復。

FWIW碎片的情況也是如此,除非它們被更頻繁地創建和銷燬(例如,當您在橫向和縱向之間旋轉設備時)。瞭解活動和片段生命週期並正確使用它對於編寫一個行爲良好的應用程序至關重要。

+0

感謝菲爾。我知道這些活動經常被創建和銷燬,並且應該使用onPause和onResume來處理,但是當您從一個活動調用startActivityForResult時會發生什麼,然後當您返回結果時重新創建該活動? onActivityResult在這種情況下如何工作? –

+0

我發現了在重新調用活動的情況下onCreate()之前調用onActivityResult()的困難方式。因此,最安全的方法是簡單地將響應保存到onActivityResult()中的實例變量中,然後在onResume()中對其執行操作。由於onResume()會被調用,即使onCreate()不會在沒有任何條件邏輯的情況下滿足這兩種情況。當然,您需要清除實例變量作爲onResume()的最後一部分,以便下次再次使用時不會再使用它。 – Phil

+0

我按照你的建議,但沒有奏效。在onActivityResult中,我保存了響應,並且還激活了一個布爾型標誌,稍後我在onResume中進行檢查。之後,標記爲真的標誌我加載了返回的值,但仍然是空的。 –

0

例如,當智能手機從縱向模式切換到橫向模式時,您的活動將被破壞並重新創建,因此需要備份數據或重置數據。

對於AddPictures類,嘗試將Activity中的數據保存在onSaveInstanceState(Bundle outState)方法中,並在onCreate()方法中檢索它們。如果您的活動被重新創建,Theses方法會恢復您的數據。

例子:

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("iReturnedEntry", iEntry); 
    } 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState != null) { 
      String dataSaved = savedInstanceState.getString("iReturnedEntry"); 
      Log.v("HelloWorldActivity", "iReturnedEntry=" + dataSaved); 
     } 

    } 
+0

謝謝賈維斯。其實我也實現這種方法也用於其他目的,但我的問題是,我期待從另一個使用startActivityForResult的活動的結果,似乎當重新創建第一個活動時,onActivityResult的功能會受到某種程度的影響。 –

相關問題