【问题标题】:When onRestoreInstanceState is called ? ( android kitkat ) [duplicate]何时调用 onRestoreInstanceState ? (android kitkat)[重复]
【发布时间】:2014-06-09 22:05:06
【问题描述】:

为了查看是否调用了onRestoreInstanceState,我做了这个小java代码

package com.MCHAppy.demostate.app;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;


public class MainActivity extends ActionBarActivity {
    private int visiters=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

     }

     @Override
     protected void onResume() {
         super.onResume();
          visiters++;
         Log.d("Test","Resumed");
     }

     @Override
       protected void onSaveInstanceState(Bundle outState) {
           super.onSaveInstanceState(outState);
           outState.putInt("visiters",visiters);
           Log.d("Test",visiters+" visiters  was saved ");
       }

     @Override
     protected void onRestoreInstanceState(Bundle savedInstanceState) {
           super.onRestoreInstanceState(savedInstanceState);
           visiters=savedInstanceState.getInt("visiters");
           Log.d("Test",visiters+" visiters was restored");
     }
 }

当我点击主页图标时,我在 Logcat 中得到了这个

  06-09 17:09:58.240    1316-1316/com.MCHAppy.demostate.app D/MCHAppy﹕ 1 visiters  was saved

当我回到我的活动时,我在 Logcat 中得到了这个

06-09 17:58:13.230    1316-1316/com.MCHAppy.demostate.app D/MCHAppy﹕ Resumed

似乎从未调用过 onRestoreInstanceState 。真的是这样吗?

谢谢

【问题讨论】:

  • Activity 被杀了吗?如果Activity没有被系统终止,它不会被调用。
  • 我已经看到了这些答案,但它们没有帮助我:/

标签: java android


【解决方案1】:

通过the documentation

当活动从先前保存的状态重新初始化时,在 onStart() 之后调用此方法,此处在 savedInstanceState 中给出。

其中的关键部分是它仅在活动被重新初始化时调用。但是,始终会在 onCreate(Bundle savedInstanceState) 中传递相同的包,因此您可以将逻辑移到那里。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        visiters=savedInstanceState.getInt("visiters");
    }
}

【讨论】:

  • 但是 onCreate 方法只会在你第一次启动活动时被调用。所以当我点击主页图标然后返回我的应用程序时,不会调用 onCreate 并且我看不到访问者的数量。
  • 这是不正确的。每次重新初始化活动时都会调用 onCreate 和 onRestoreInstanceState。如果 onCreate 没有被调用,那么你永远不会被销毁,visiters 仍将具有其先前的值。 This article 更详细。
  • 可以肯定的是,我在 onCreate 方法中放了一个Log.d("Test","onCreate method was called to restore state"); 但 Logcat 第一次显示该消息,然后它再也没有显示给我。这是什么意思?
  • 这意味着您的活动从一开始就不会被破坏。因此它永远不需要保存和恢复它的实例。在onDestroy(...) 中添加一条日志语句,看看它是否被调用过。
  • onDestroy 从未被调用过。根据您提到的文章, oncreate --> onRestoreInstanceState --> onResume 。不能这样调用 onPause --> onStop --> onRestart --> onStart --> onRestoreInstanceState --> onResume ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多