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

时间:2010-11-17 12:30:40

标签: android

我试图通过以下示例保存我的activty的onSaveInstanceState(Bundle)方法中的一些值:Saving Android Activity state using Save Instance State

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

现在我读到了我刚刚发布的那个问题,并且有人注意到他们无法让它在模拟器中运行?不幸的是,我正在努力。在模拟器上并且无法在设备上测试应用程序,因为我现在没有可用的设备而且我正在与之交互的Web服务位于我的工作机器上的本地VM中,此时无法远程访问。

我的问题是,保存的捆绑包不适用于模拟器吗?我还注意到,当我解除或启动一项新活动时,活动会在暂停时调用,然后在onStop上调用。当我带回同样的活动时,它会直接进入创造?

现在根据这里的文档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);
}

我的onCreate

@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 个答案:

答案 0 :(得分:2)

  

bundle对象总是为null但是每当我解除激活时它确实会进入onSaveInstanceState方法来保存我的值。

如果“解雇”是指“按下BACK按钮”,则Bundle onSaveInstanceState()(如果有)被丢弃,因为用户已表明他们已完成活动。 onSaveInstanceState() Bundle用于用户尚未表示已完成活动的情况(例如,他们接受了来电)但Android选择销毁该活动以释放RAM。 / p>

  

我的问题是,保存的捆绑包不适用于模拟器吗?

onSaveInstanceState()在模拟器中完美运行。在模拟器中测试onSaveInstanceState()的最简单方法是更改​​屏幕方向([Ctrl] - [F11])。

  

我还注意到,当我关闭或启动新活动时,活动会在暂停时调用,然后在onStop上调用。当我带回同样的活动时,它会直接进入创造?

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

  

但是如果你在onStop()部分下面的那个图上面读到它说下一步它是onRestart()还是onDestroy()?没有提到onCreate?在文档上输入?

图表通常是正确的。在某些情况下,onDestroy()未被调用(例如,紧急RAM回收强制您的进程被杀死),但这种情况并不常见。