Android activity的變數儲存

來源:互聯網
上載者:User
一、當一個在Activity aA啟動另一個Activity aB的時候兩個Activity的回呼函數的調用順序:

    1、aA的onPause()被調用;
    2、aB的onCreate(),onStart(),onResume()調用依次被調用,此時aB擷取了使用者焦點;
    3、這時如果aA如果在螢幕上不可見(aB的介面並不是全螢幕的),那aA的onStop()被調用。

    由以上可以引申:如果在aA中修改的資料需要在aB中使用,這時就需要在onPause()中對修改的資料進行儲存到資料庫中(或其他可被兩Activity共用的空間),而不能在onStop()中進行。
二、臨時變數的儲存:
    因為當onPause()和onStop()被調用後,有可能因記憶體不足而可被系統銷毀,所以要對一些資料進行儲存,以防止Activity被系統kill掉而丟失:
    一些需要儲存到資料庫資料執行儲存,這些資料可以在onCreate()方法中重新從資料庫中載入;
    一些不能儲存到資料庫中的資料(資料庫中並沒有為此部份資料設定相應欄位,如僅用於標識當前Activity的狀態資訊的資料)通過onSaveInstanceState(Bundle)來儲存到Bundle中,隨後系統再次進行回退到此Activity的時候,系統會在onCreate(Bundle)中從Bundle中擷取到之前儲存的資料,或者通過onRestoreInstanceState(Bundle)(在onStart()方法後被調用)方法來擷取並設定儲存的資料;
    對一些不能用Bundle記錄的資料,可以在Object onRetainNonConfigurationInstance()中進行儲存,並通過getLastNonConfigurationInstance()方法擷取之前函數返回的Object,並根據此Object進行設定(這步還原的操作可在onCreate()和onStart()方法中執行)。
三、onSavdInstanceState(Bundle)與onPause()的調用時機的區別:
    1、當因要啟動另一個Activity,當前Activity要失去焦點時,前者先被調用然後是後者;
    2、當點擊BACK鍵或調用finish()結束當前Activity時,前者是不會被調用的(調用順序:onPause()->onStop()->onDestory())。
四、Activity的一些配置(如螢幕方向)改變了的時候,系統預設是重新啟動這個Activity,也可以自己處理某些配置改變事件:
    <activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">
    像上面android:configChanges的配置,當這些配置改變後,系統是不會重新啟動Activity的,這是系統會去調用onConfigurationChanged()方法。
    我們就可以自己實現此方法來根據作出相應處理,如下:
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();//當然實際的處理應該不是這樣
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
    }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.