代码之家  ›  专栏  ›  技术社区  ›  Jono

Android不会保存活动的当前状态

  •  1
  • Jono  · 技术社区  · 15 年前

    Saving Android Activity state using Save Instance State

    但是它似乎没有从Oncreate()加载它。bundle对象总是空的,但是每当我调用另一个activity时,它确实进入onSaveInstanceState方法来保存我的值。

    现在根据这里的文件 http://developer.android.com/guide/topics/fundamentals.html#actlife 就生命周期图所显示的内容而言,这是正确的,但是如果您在onStop()部分阅读该图下面的内容,它会说它进入的下一步是onRestart()或onDestroy()?没有提到onCreate?在文件上打字?

    总之,这里是同一活动中的onSaveInstanceState()和onCreate():

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "SAVING OauthManager in onSaveInstanceState");
        // TODO: if works, we need to save the my network list HashMap as well
        // so we dont make a call to the platform everytime we refresh this
        // screen
        // savedInstanceState.putSerializable("oauthManager", mOathManager);
        // Log.d(TAG, "finished saving");
        // super.onSaveInstanceState(savedInstanceState);
        // Log.d(TAG, "super.onSaveInstanceState(savedInstanceState)");
    
        savedInstanceState.putString(USER_CONSUMER_ID,
                mSavedUserConsumerTokenId);
        savedInstanceState.putString(USER_CONSUMER_SECRET,
                mSavedUserConsumerSecret);
    
        savedInstanceState.putString(URL_REQUEST_TOKEN, mSavedRequestTokenUrl);
        savedInstanceState.putString(URL_ACCESS_TOKEN, mSavedAccessTokenUrl);
        savedInstanceState.putString(URL_AUTHORIZE_TOKEN,
                mSavedAuthorizeTokenUrl);
        super.onSaveInstanceState(savedInstanceState);
    }
    

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            Log.d(TAG, "    ");
            Log.d(TAG, "onCreate");
            Log.d(TAG, "///////////////////////////////////////");
            Log.d(TAG, "///////////////////////////////////////");
            super.onCreate(savedInstanceState);
            Log.d(TAG, "super.onCreate(savedInstanceState);");
            setContentView(R.layout.network_list);
            mContext = getApplicationContext();
            mIntent = getIntent();
    
    
            mGoogleButton = (Button) findViewById(R.id.googleAddOrRemoveButton);
            mFacebookButton = (Button) findViewById(R.id.facebookAddOrRemoveButton);
            mLinkedInkButton = (Button) findViewById(R.id.linkedInAddOrRemoveButton);
            mPopEmailButton = (Button) findViewById(R.id.popEmailAddOrRemoveButton);
    
    
            if (savedInstanceState != null) {
                Log.d(TAG, "inside if (savedInstanceState != null) {");
                Log.d(TAG, "savedInstanceState != null");
                // mOathManager = (OAuthManager) savedInstanceState
                // .getSerializable("oauthManager");
                mSavedUserConsumerTokenId = savedInstanceState
                        .getString(USER_CONSUMER_ID);
                mSavedUserConsumerSecret = savedInstanceState
                        .getString(USER_CONSUMER_SECRET);
    
                mSavedRequestTokenUrl = savedInstanceState
                        .getString(URL_REQUEST_TOKEN);
                mSavedAccessTokenUrl = savedInstanceState
                        .getString(URL_ACCESS_TOKEN);
                mSavedAuthorizeTokenUrl = savedInstanceState
                        .getString(URL_AUTHORIZE_TOKEN);
    
                mOathManager = new OAuthManager(mContext, getIntent(),
                        mSavedUserConsumerTokenId, mSavedUserConsumerSecret,
                        mSavedRequestTokenUrl, mSavedAccessTokenUrl,
                        mSavedAuthorizeTokenUrl, CALLBACK_URI);
    
                mOathManager.requestUserRequestToken();
            } else{
    
                Log.d(TAG, "savedInstanceState is null and loading the list again");
                GetNetworkListTask getNetworkListTask = new GetNetworkListTask();
                getNetworkListTask.execute();
            }
    
    
    
    
        }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   CommonsWare    15 年前

    如果“dismise”是指“press the BACK button”,那么 Bundle onSaveInstanceState() (如果有)将被丢弃,因为用户已指示他们已完成活动。这个 onSaveInstanceState() 捆绑 如果用户没有说他们已经完成了活动(例如,他们接受了一个来电),而Android选择销毁活动来释放RAM,那么就使用这个函数。

    我的问题是,保存的包在模拟器上不起作用是真的吗?

    onSaveInstanceState() 在模拟器中工作得非常好。最简单的测试方法 onSaveInstanceState() 在仿真器中,可以更改屏幕方向([Ctrl]-[F11])。

    我还注意到,当我取消或启动一个新活动时,该活动会先调用onPause,然后调用onStop。当我把同样的活动带回来时,它直接转到onCreate?

    你对Android有一些基本的误解,远远超出了单一答案的范围。

    但是如果你阅读下面的onStop()部分的图表,它会告诉你下一步是onRestart()还是onDestroy()?没有提到onCreate?在文件上打字?

    onDestroy() 不调用(例如,紧急RAM回收强制终止进程),但这种情况并不常见。