簡體   English   中英

為什么在銷毀活動時調用 onRestoreInstanceState 以獲取視圖?

[英]Why is onRestoreInstanceState called for a view when the activity is destroyed?

在下面的堆棧跟蹤中,您可以注意到,由於 Activity 被銷毀,視圖的 onRestoreInstanceState 被調用。 為什么這是必要的?

    at com.mypackage.MyView.onRestoreInstanceState(Unknown Source)
    at android.view.View.dispatchRestoreInstanceState(View.java:13758)
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2889)
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2895)
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2895)
    at android.view.View.restoreHierarchyState(View.java:13736)
    at android.support.v4.app.Fragment.restoreViewState(Unknown Source)
    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(Unknown Source)
    at android.support.v4.app.FragmentActivity.onReallyStop(Unknown Source)
    at android.support.v4.app.FragmentActivity.doReallyStop(Unknown Source)
    at android.support.v4.app.FragmentActivity.onDestroy(Unknown Source)
    at android.support.v7.app.o.onDestroy(Unknown Source)
    at android.app.Activity.performDestroy(Activity.java:6189)
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1164)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3778)
    ... 10 more

編輯

View.onRestoreInstanceState接收任何View.onSaveInstanceState產生。 onSaveInstanceState 的文檔說:“鈎子允許視圖生成其內部狀態的表示,以后可用於創建具有相同狀態的新實例。” - 當執行 onDestroy 時,不需要重新創建視圖,那么為什么要調用 onRestoreInstanceState 呢?

您的FragmentonRestoreInstanceState作為ActivityonDestroy的一部分發生。

這是FragmentManagerImpl的行為:

void moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive) {
    //...
    case Fragment.CREATED:
    if (newState > Fragment.CREATED) {
    //...
        f.performActivityCreated(f.mSavedFragmentState);
        if (f.mView != null) {
            f.restoreViewState(f.mSavedFragmentState);
        }
        f.mSavedFragmentState = null;
    }
}

如果片段的狀態被改變(移動)並且片段的視圖不為空,那么作為這個過程的一部分,restoreViewState 總是被調用。

也許您沒有將super.onDestroy()稱為onDestroy的第一條語句?

我想問題應該是:為什么片段銷毀后savedInstanceState不為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM