为什么在onStart之后没有调用onRestoreInstanceState?

时间:2014-06-09 23:39:14

标签: android

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

  1. 开始我的活动。 onCreate -- > onStart --> onResume被召唤。
  2. 按下模拟器上的主页按钮。 onPause --> onSaveInstanceState --> onStop被召唤。
  3. 点击启动器中的图标,然后重新启动我的活动。 onRestart --> onStart --> onResume被召唤。
  4. 我的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被称为

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

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

    由于

2 个答案:

答案 0 :(得分:1)

仅在onStart()被调用后才onSaveInstanceState()

来自文档:

  

当活动出现时,在onStart()之后调用此方法   从之前保存的状态重新初始化,在此处给出   savedInstanceState。大多数实现都会使用   onCreate(Bundle)恢复他们的状态,但有时候   在完成所有初始化之后,这里可以方便地完成   或者允许子类决定是否使用默认值   实现。此方法的默认实现执行   恢复之前被冻结的任何视图状态   的onSaveInstanceState(束)。

     

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

Activity#onRestoreInstanceState()

答案 1 :(得分:1)

官方文档说明了onRestoreInstanceState (Bundle savedInstanceState)

  

当活动出现时,在onStart() 之后调用此方法   从之前保存的状态重新初始化 ,在此处给出   savedInstanceState。大多数实现都会使用   onCreate(Bundle)恢复他们的状态,但有时候   在完成所有初始化之后,这里可以方便地完成   或者允许子类决定是否使用默认值   实现。此方法的默认实现执行   恢复之前被冻结的任何视图状态   的onSaveInstanceState(束)。

     

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

当活动重新初始化时?

  • 当设备方向发生变化时,您的活动会重新初始化。
  • 如果您的应用程序前面有其他活动,并且操作系统因某种原因导致您的应用程序被杀,则可能是免费资源。

尝试更改模拟器的方向:

  

控制+ F12

查看用户@GAThrawn的answer

  

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

     

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

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