2014-02-09 55 views
0

我有3類Ç的Android的onCreate()和的onResume()的查詢

我把一些對象從A改爲B。在B,在onCreate(),我從意圖中拉出這些,並保留它們作爲類變量。現在活動B允許用戶編輯這些對象。這通過startActivityForResult()通過將對象從B傳遞到C而發生。

現在,當用戶正與編輯完成後,Ç與修改的對象,並且結束沿通過的結果INT回。現在當我回到B,在onActivityResult(),我拉出這些對象,並更新相應的類變量。但onCreate()再次調用,類恢復到那個一個送給而不是保持該Ç送給的那些對象。

現在,如果使得onCreate()B每次都訪問數據庫,並且顯然它工作正常。但它看起來很浪費。

那麼,我該如何處理這種情況呢?如果onCreate()無論如何將被稱爲,似乎onResume(),startActivityForResult()onActivityResult()是沒用的,我不妨將所有的代碼在onCreate()

請指教!

下面是將用戶從Ç

public void goToC(View v) { 

     Intent intent = new Intent(this, C.class); 
     intent.putExtra("STUFF", stuff); 
     startActivityForResult(intent, 1); 

} 

下面是代碼中Ç其將數據傳遞迴

long rowsUpdated = myModel.updateStuff(this, stuff); 

if (rowsUpdated == 1) { 
    Intent intent = new Intent(this, B.class); 
    // put the data in the intent 
    intent.putExtra("STUFF", stuff); 
    // set the flags to reuse B 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    // set result code to notify the ItemEntriesActivity 
    setResult(1, intent); 
    // finish the current activity i.e. C 
    finish(); 
} 

代碼這裏是B中的代碼,它接收上面的da TA

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     if (intent != null) { 
      switch (resultCode) { 
      case 1: 
       // Update the class variable, so that onResume() gets the updated value 
       stuff = intent.getExtras().getParcelable("STUFF"); 
       break; 
      default: 
       break; 
      } 

     } 
    } 

正如我所說的,這個代碼工作正常,但由於B.onCreate()被在此之後執行,活動B再次使用的舊值結束。

更新:我試圖從Ç回去時使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP)。這仍然不起作用。我在電話finish()。任何建議表示讚賞!

更新2:當我在把一個調試點在onStop(),它是越來越只要我切換到Ç調用。難怪B中的onCreate()將被調用。現在我的問題是爲什麼onStop()被調用。我在C做的唯一'非自然'的事情是使用getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);來顯示沒有鍵盤的TextEdits。所以我試着將android:configChanges="keyboard|keyboardHidden"加入到Manifest的活動中,沒有任何區別。再次,任何建議表示讚賞。

+0

當必須(重新)創建活動並且無法阻止該活動發生時調用'onCreate'。最初的意圖是有用的,所以你有兩種不同的意圖,你必須以不覆蓋它的方式進行管理。 – zapl

+0

將修改後的變量寫入意圖(或以其他方式保存)。然後檢查修改後的值,並在OnCreate中代替默認值加載它們。 – NameSpace

+0

當我在** B **中執行'getIntent()'時,我總是得到我從A發送的那個。這是因爲我在** C **中調用了'finish()'而不是'startActivity()' 。那麼我應該繼續並刪除'onResume()','onActivityResult()'等,等等? – rgamber

回答

0

您所創建的Intent去與

Intent intent = new Intent(this, B.class); 

此構造函數將創建B另一個實例這的確會調用onCreate()。您應該使用空的構造函數

Intent intent = new Intent(); 
// set result code to notify the ItemEntriesActivity 
setResult(1, intent); 
// finish the current activity i.e. C 
finish(); 
+0

感謝您的時間,但這一修改並未改變結果。這是有道理的。我想知道更多關於Intents的內容。在調試時,onCreate()仍然被擊中。還有什麼想法? – rgamber

+0

嗯...不是在這個時候。這應該修復它。你沒有在'B'中調用'finish()',對吧?我遇到過這樣的問題,而Intent構造函數通常是罪魁禍首。 – codeMagic

+0

Nopes,我發佈了將用戶從B到C的代碼。它幾乎只是用一個新的Intent調用'startActivityForResult()'。謝謝你的時間,但!我很感激! – rgamber

相關問題