簡體   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