【问题标题】:Why isn't onRestoreInstanceState called after onStart?为什么在 onStart 之后不调用 onRestoreInstanceState?
【发布时间】:2014-06-09 23:39:13
【问题描述】:

我正在尝试测试 onRestoreInstanceState 方法以及何时(确切地)调用它。所以我遵循了这些步骤:

  1. 开始我的活动。 onCreate -- > onStart --> onResume 被调用。
  2. 按模拟器上的主页按钮。 onPause --> onSaveInstanceState --> onStop 被调用。
  3. 单击启动器中的图标并再次启动我的活动。 onRestart --> onStart --> onResume 被调用。

我的java代码:

package com.test.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);
       Log.d("TAG","onCreate");

   }

  @Override
   protected void onPause() {
      super.onPause();
       Log.d("TAG","onPause");
  }

  @Override
   protected void onStop() {
       super.onStop();
       Log.d("TAG","onStop");
   }

   @Override
   protected void onStart() {
       super.onStart();
       Log.d("TAG","onStart");
   }

   @Override
    protected void onRestart() {
       super.onRestart();
       Log.d("TAG","onRestart");

   }

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

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

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

     @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("TAG","onDestroy");
    }
}

来自文档:Instead of restoring the state during onCreate() you may choose to implement onRestoreInstanceState(), which the system calls after the onStart() method .

所以调用onRestoreInstanceState

  • Activity 被销毁后onPause --> onStop --> onDestroy 然后onCreate --> onRestoreInstanceState --> onResume(例如由于屏幕旋转)
  • 活动停止后onPause --> onStop --> onRestart --> onStart --> onRestoreInstanceState --> onResume(例如由于主页图标按下)

但是为什么在 onStart 之后不调用呢?

谢谢

【问题讨论】:

  • "..系统在 onStart() 方法之后调用。" - 请写出与问题相关的标题。
  • @user2864740 ,我的问题标题已编辑“为什么不是...”
  • 在第二步之后,再次按下主页按钮并点击您打开的应用程序。尝试在智能手机上执行您的应用程序。
  • @Lucas Santos 还是不行
  • 尝试改变方向而不是按主页按钮。

标签: android


【解决方案1】:

仅当 onSaveInstanceState() 已被调用时,在 onStart() 之后。

来自文档:

该方法在活动开始时在onStart()之后调用 从先前保存的状态重新初始化,在此处给出 保存的实例状态。大多数实现将简单地使用 onCreate(Bundle) 来恢复它们的状态,但有时是 完成所有初始化后,方便在这里进行 或允许子类决定是否使用您的默认值 执行。此方法的默认实现执行 恢复以前被冻结的任何视图状态 onSaveInstanceState(Bundle)。

此方法在 onStart() 和 onPostCreate(Bundle) 之间调用。

Activity#onRestoreInstanceState()

【讨论】:

  • 好的理解。在我的代码中,我调用了 onSaveInstanceState 和 onRestoreInstanceState 。我已经测试过是否使用 Log.d 方法调用了 onRestoreInstanceState 但没有显示任何内容(我使用的是 android studio 0.5.2)
  • @JamesDaniel 覆盖 onSaveInstanceState() 时是否保存了任何状态?
【解决方案2】:

官方文档说onRestoreInstanceState (Bundle savedInstanceState)

这个方法在 onStart() 之后调用 activity 正在执行时 从以前保存的状态重新初始化,此处给出 保存的实例状态。大多数实现将简单地使用 onCreate(Bundle) 来恢复它们的状态,但有时是 完成所有初始化后,方便在这里进行 或允许子类决定是否使用您的默认值 执行。此方法的默认实现执行 恢复以前被冻结的任何视图状态 onSaveInstanceState(Bundle)。

此方法在 onStart() 和 onPostCreate(Bundle) 之间调用。

Activity 何时重新初始化?

  • 当设备的方向发生变化时,您的活动将重新初始化。
  • 当您的应用前面有另一个活动并且操作系统出于某种原因终止您的应用时,可能是例如免费资源。

尝试改变模拟器的方向:

Ctrl+F12

查看用户@GAThrawn 的answer

按下 Home 按钮,您将离开应用程序并转到主屏幕, 同时让您的应用程序在后台运行。这有点像 在 Windows PC 上的窗口之间切换。

除非你的手机内存不足 将开始关闭在后台运行的应用程序,以便 你的手机有足够的资源来完成你现在要做的事情。 游戏通常是手机会“杀死”以保存的第一批应用程序之一 资源,因为它们通常比其他应用程序使用更多的内存和 CPU。 这就是为什么有时您的游戏仍在运行暂停,有时 Android 已为您关闭它。

所以我无法证明我的第二个论点,因为它决定它是操作系统,至少不知道如何证明。

【讨论】:

  • 您只需证明第一个建议(在活动被破坏之后)就可以了。但是第二个建议怎么样(在活动停止而不被破坏之后)?
  • 我编辑了我的答案,看。如果对他有用并解决了您的问题,请接受我的回答。
  • 尝试按 Home 按钮并杀死您的应用,重新打开您的应用后,看看这是否证明了我的第二个论点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多