繁体   English   中英

为什么在onStart之后不调用onRestoreInstanceState?

[英]Why isn't onRestoreInstanceState called after onStart?

我正在尝试测试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

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

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

谢谢

onStart()只有在onStart() onSaveInstanceState()

来自文档:

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

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

活动#onRestoreInstanceState()

关于onRestoreInstanceState (Bundle savedInstanceState)的官方文档说明:

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

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

当活动重新初始化时?

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

尝试更改模拟器的方向:

按Ctrl + F12

看看用户@GAThrawn的答案

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM