【问题标题】:Android wont save the current state of an activityAndroid不会保存活动的当前状态
【发布时间】:2010-11-17 21:22:25
【问题描述】:

我正在尝试按照以下示例在我的活动的 onSaveInstanceState(Bundle) 方法中保存一些值:Saving Android Activity state using Save Instance State

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

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

我的问题是,保存的包真的不能在模拟器上运行吗?我还注意到当我关闭或启动一个新活动时,活动会调用 onPause,然后调用 onStop。当我带回相同的活动时,它会直接进入 onCreate?

现在根据这里的文档http://developer.android.com/guide/topics/fundamentals.html#actlife 就生命周期图显示的内容而言这是正确的,但是如果您在 onStop() 部分的该图下方阅读,它会说它进入的下一步是 onRestart() 或销毁()?没有提到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();
        }




    }

【问题讨论】:

  • 嗨,你能解决这个问题吗?我在摩托罗拉里程碑手机上遇到过这个问题(我尝试过的模拟器和其他几部手机似乎没有保存但未恢复 InstanceState 的问题)

标签: android


【解决方案1】:

bundle 对象始终为空,但每当我关闭活动时,它确实会进入 onSaveInstanceState 方法来保存我的值。

如果“dismiss”是指“按 BACK 按钮”,则来自onSaveInstanceState()(如果有)的Bundle 将被丢弃,因为用户已指示他们已完成活动。 onSaveInstanceState() Bundle 用于用户尚未说他们已完成活动(例如,他们接听了来电)但 Android 选择销毁活动以释放 RAM 的情况。

我的问题是,保存的包真的不能在模拟器上运行吗?

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

我还注意到,当我关闭或启动新活动时,活动会调用 onPause,然后调用 onStop。当我带回相同的活动时,它会直接进入 onCreate?

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

但是,如果您在 onStop() 部分的该图下方阅读,它会说它进入的下一步是 onRestart() 或 onDestroy()?没有提到onCreate?在文档上输入?

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

【讨论】:

  • 我不知道,我完全理解 android 但我只是参考文档,也许是一个潜在的问题,为什么包没有正确加载或保存。当我的意思是被解雇时,我的意思是当另一个活动启动时。我会修改我的帖子以反映这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多