Activity之生命週期

  1. 正常情況下的生命週期
    A->B
    AonPause-BonCreate-BonStart-BonResume(-AonStop這個是否執行取決於A是否被全部覆蓋)
    B->A
    BonPause-AonStart-AonResume-BonStop-BonDestroy
    當Activity切換時,需要先將棧頂Activity置爲pause,再執行新Activity的方法(此時棧頂爲新的Activity)。
    所以如果有保存數據耗時操作的話,儘量在onStop中執行,是爲了不妨礙新Activity的頁面展現。而設置或者取數據等操作可以放在onResume中執行。
  2. 橫豎屏切換時的生命週期
    2.1 不設置configChange
    切至橫屏:
onPause
            onSaveInstanceState[Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@d414664, 2131427397=android.view.AbsSavedState$1@d414664, 2131427398=android.view.AbsSavedState$1@d414664, 2131427399=android.support.v7.widget.Toolbar$SavedState@9efe2af, 2131427400=android.view.AbsSavedState$1@d414664, 2131427417=android.view.AbsSavedState$1@d414664, 2131427418=TextView.SavedState{48f06bc start=0 end=0 text=}}, android:focusedViewId=2131427418}]}]]
            onStop
            onDestroy
            onCreate:saveInstanceState[Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@d414664, 2131427397=android.view.AbsSavedState$1@d414664, 2131427398=android.view.AbsSavedState$1@d414664, 2131427399=android.support.v7.widget.Toolbar$SavedState@9efe2af, 2131427400=android.view.AbsSavedState$1@d414664, 2131427417=android.view.AbsSavedState$1@d414664, 2131427418=TextView.SavedState{48f06bc start=0 end=0 text=}}, android:focusedViewId=2131427418}]}]]
            onStart
            onRestoreInstanceState[Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@d414664, 2131427397=android.view.AbsSavedState$1@d414664, 2131427398=android.view.AbsSavedState$1@d414664, 2131427399=android.support.v7.widget.Toolbar$SavedState@9efe2af, 2131427400=android.view.AbsSavedState$1@d414664, 2131427417=android.view.AbsSavedState$1@d414664, 2131427418=TextView.SavedState{48f06bc start=0 end=0 text=}}, android:focusedViewId=2131427418}]}]]
            onResume

切至豎屏:

onPause
            onSaveInstanceState[Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@d414664, 2131427397=android.view.AbsSavedState$1@d414664, 2131427398=android.view.AbsSavedState$1@d414664, 2131427399=android.support.v7.widget.Toolbar$SavedState@e6fed31, 2131427400=android.view.AbsSavedState$1@d414664, 2131427417=android.view.AbsSavedState$1@d414664, 2131427418=TextView.SavedState{4d31c16 start=0 end=0 text=}}, android:focusedViewId=2131427418}]}]]
            onStop
            onDestroy
            onCreate:saveInstanceState[Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@d414664, 2131427397=android.view.AbsSavedState$1@d414664, 2131427398=android.view.AbsSavedState$1@d414664, 2131427399=android.support.v7.widget.Toolbar$SavedState@e6fed31, 2131427400=android.view.AbsSavedState$1@d414664, 2131427417=android.view.AbsSavedState$1@d414664, 2131427418=TextView.SavedState{4d31c16 start=0 end=0 text=}}, android:focusedViewId=2131427418}]}]]
            onStart
            onRestoreInstanceState[Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@d414664, 2131427397=android.view.AbsSavedState$1@d414664, 2131427398=android.view.AbsSavedState$1@d414664, 2131427399=android.support.v7.widget.Toolbar$SavedState@e6fed31, 2131427400=android.view.AbsSavedState$1@d414664, 2131427417=android.view.AbsSavedState$1@d414664, 2131427418=TextView.SavedState{4d31c16 start=0 end=0 text=}}, android:focusedViewId=2131427418}]}]]
            onResume

保存數據:

Activity.java:
            final void performSaveInstanceState(Bundle outState) {
                onSaveInstanceState(outState);  // 保存頁面信息
                saveManagedDialogs(outState);  // 保存Dialog信息
                mActivityTransitionState.saveState(outState);  // 保存頁面跳轉信息
                storeHasCurrentPermissionRequest(outState);
            }

            protected void onSaveInstanceState(Bundle outState) {
                outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());  // 保存Window信息
                Parcelable p = mFragments.saveAllState();
                if (p != null) {
                    outState.putParcelable(FRAGMENTS_TAG, p);  // 保存Fragment信息
                }
                getApplication().dispatchActivitySaveInstanceState(this, outState);
            }

        PhoneWindow.java:
            public Bundle saveHierarchyState() {
                Bundle outState = new Bundle();
                if (mContentParent == null) {
                    return outState;
                }

                SparseArray<Parcelable> states = new SparseArray<Parcelable>();
                mContentParent.saveHierarchyState(states);  // 保存頁面View信息
                outState.putSparseParcelableArray(VIEWS_TAG, states);

                // Save the focused view ID.
                final View focusedView = mContentParent.findFocus();
                if (focusedView != null && focusedView.getId() != View.NO_ID) {
                    outState.putInt(FOCUSED_ID_TAG, focusedView.getId());
                }

                // save the panels
                SparseArray<Parcelable> panelStates = new SparseArray<Parcelable>();
                savePanelState(panelStates);
                if (panelStates.size() > 0) {
                    outState.putSparseParcelableArray(PANELS_TAG, panelStates);
                }

                if (mDecorContentParent != null) {
                    SparseArray<Parcelable> actionBarStates = new SparseArray<Parcelable>();
                    mDecorContentParent.saveToolbarHierarchyState(actionBarStates);
                    outState.putSparseParcelableArray(ACTION_BAR_TAG, actionBarStates);
                }

                return outState;
            }

        View.java:
            public void saveHierarchyState(SparseArray<Parcelable> container) {
                dispatchSaveInstanceState(container);
            }

            protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
                if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {  // 設置了id且沒有disableSave
                    mPrivateFlags &= ~PFLAG_SAVE_STATE_CALLED;
                    Parcelable state = onSaveInstanceState();
                    if ((mPrivateFlags & PFLAG_SAVE_STATE_CALLED) == 0) {
                        throw new IllegalStateException(
                                "Derived class did not call super.onSaveInstanceState()");
                    }
                    if (state != null) {
                        // Log.i("View", "Freezing #" + Integer.toHexString(mID)
                        // + ": " + state);
                        container.put(mID, state);
                    }
                }
            }

            protected Parcelable onSaveInstanceState() {
                mPrivateFlags |= PFLAG_SAVE_STATE_CALLED;
                if (mStartActivityRequestWho != null) {
                    BaseSavedState state = new BaseSavedState(AbsSavedState.EMPTY_STATE);
                    state.mStartActivityRequestWhoSaved = mStartActivityRequestWho; // 保存mStartActivityRequestWho
                    return state;
                }
                return BaseSavedState.EMPTY_STATE;
            }
        ViewGroup.java:
            protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
                super.dispatchSaveInstanceState(container);
                final int count = mChildrenCount;
                final View[] children = mChildren;
                for (int i = 0; i < count; i++) {
                    View c = children[i];
                    if ((c.mViewFlags & PARENT_SAVE_DISABLED_MASK) != PARENT_SAVE_DISABLED) {
                        c.dispatchSaveInstanceState(container);  // 下發到每一個子View自己的dispatchSaveInstanceState處理
                    }
                }
            }

2.2 設置configChanges=”orientation|screenSize”
切至橫屏:onConfigurationChanged[{1.0 ?mcc?mnc zh_CN ldltr sw360dp w598dp h336dp 480dpi nrml land finger -keyb/v/h -nav/h suim:1 s.16}]
切至豎屏:onConfigurationChanged[{1.0 ?mcc?mnc zh_CN ldltr sw360dp w360dp h580dp 480dpi nrml port finger -keyb/v/h -nav/h suim:1 s.17}]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章