2012-08-11 78 views
3

假設我有兩個活動,activity1和activity2。 我想從activity1導航到activity2,從activity2獲取一些信息並將其插回到activity1,同時我也不想在離開時丟失activity1之前的狀態。 我該如何保存它的狀態?使用onResume和onPause

回答

0

您應該重寫onSaveInstanceState(Bundle savedInstanceState)

請檢查this答案示例代碼

或者使用SharedPreferences。檢查this代碼

2

覆蓋onSaveInstanceState(Bundle)activity1保存任何您想要的數據,然後在同一活動中覆蓋onRestoreInstanceState(Bundle)以獲取值。使用Bundle,你可以存儲你想要的任何數據。我推薦這樣的:

public class MainActivity extends Activity { 
    ... 
    public static final String DATA1_KEY = "data1"; 

    private boolean value1; 
    ... 

    @Override 
    protected void onSaveInstanceState (Bundle outState) { 
     outState.putBoolean(DATA1_KEY, value1); 
    } 

    @Override 
    protected void onRestoreInstanceState (Bundle savedInstanceState) { 
     value1 = savedInstanceState.getBoolean(DATA1_KEY); 
    } 
} 
0

如果你想保持你的數據只在運行時保持活動狀態,考慮使用靜態成員。然後,您可以從任何活動中訪問和操作這些成員。例如:

public class FirstActivity extends Activity 
{ 
    public static String data = null; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(...); 
     data = "This is a test!"; 
    } 
} 

從你的第二個活動,你可以訪問諸如

public class SecondActivity extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(...); 
     if(FirstActivity.data!=null) 
     { 
      //You can use it: 
      System.out.println(FirstActivity.data); 
     } 
    } 
} 

當然你也可以添加getter/setter函數,使之更安全,更優雅的這些靜態變量。

如果你想將它們存儲時間較長,則請考慮使用:

4

您所描述的是使用Activity.startActivityForResult()方法的完美經典理由。

這是谷歌這種方法文檔中寫道:

啓動爲您希望的結果,當它完成了一個活動。當這個Activity退出,您的onActivityResult()方法將被給定requestCode

所以你應該做的是呼籲:從結果的活動1開始活動,並從活性2使用setResult(int resultCode, Intent data)方法你想要的數據你的活動1回來,並致電finish()(它會回到onActivityResult()在同一國家activity1以前..)。

0

用戶在您的應用中執行一項操作,開始一項新活動。當第二個活動創建時,當前活動停止。如果用戶然後按下「後退」按鈕,則第一個活動將重新啓動。

當您的活動停止時,活動對象將保持駐留在內存中,並在活動恢復時被調用。您不需要重新初始化任何導致恢復狀態的回調方法期間創建的組件。系統還會跟蹤佈局中每個視圖的當前狀態,因此,如果用戶將文本輸入到EditText小部件中,則會保留該內容,因此您無需保存和恢復它。

注意:即使當它停止系統破壞你的活動,它仍保留在一個Bundle(鍵值對的BLOB)查看對象(如在一個EditText文本)和恢復狀態他們如果用戶導航回到活動的同一個實例。
CommonsWare here說:

當用戶「按下返回按鈕」,然後從 的onSaveInstanceState()的包(如果有的話)被丟棄,因爲用戶已經指示他們 完成與活動。 onSaveInstanceState()Bundle 用於用戶沒有說他們已完成活動(例如,他們接受了來電)但Android 選擇銷燬活動以釋放RAM的情況。

和文檔說:

注意,它保存的onPause(持久性數據)的onSaveInstanceState(捆綁),而不是 因爲以後是不是 生命週期回調的一部分是很重要的,所以會在其文檔中描述的 在任何情況下都不會被調用。

換句話說,把你的保存/恢復的代碼不查看對象的onPause()和的onResume()代替的onSaveInstanceState(束)和onRestoreInstanceState(捆綁)。 最後,我猜你並不需要保存任何狀態,如果你只需要查看對象,如果您有任何其他國家可以使用preferencesfilesqlite將它們保存在onPause()onResume() retreive他們。

您可以在這些頁面查看更多細節:
Stopping and Restarting an Activity
Saving Activity state in Android
Android wont save the current state of an activity

+0

@ user1576427請參閱我的編輯。 – hasanghaforian 2012-08-11 12:44:00

相關問題