Lifecycle原理分析

Android_Banner.jpg

简介

  • 上一遍文章中介绍了如何使用Lifecycle来感知Acitivity的生命周期的。
  • 让我们来简单的回顾一下
    • 首先新建一个MyObsever 继承至 LifecycleObsever(如果是使用Java8 可以使用DefaultLifecycleObserver,可以不用写注解,直接重写对应的方法就可以了)
    • 在Activity(androidx下的 ComponentActivity)中通过 getLifecycle().addObserver(MyObserver()) 这行代码,将我们的观察者添加到Lifecycle中(确切说是LifcycleRegister中)
    • 通过如上的操作就能感知到Activity的生命周期了
  • 其实对于我们程序员来说,日常最多的就是使用框架,使用API,来完成需求,针对我们项目中使用的开源或者官方提供封装好的框架,我们很有必要去了解一下它的原理,起码在和别人吹牛的时候,可以有东西吹啊,觉得你这个人不禁需求完成的不错,而且还有一颗强烈学习的心
  • 针对Lifecycle的原理,我们可以从这行代码入手 getLifecycle().addObserver(MyObserver()),可以分解成如下
    • getLifecycle() ---> 获取到Lifecycle类型的对象
    • 将我们自定义好的观察者添加进去 addObserver()
Lifecycle解决什么问题?
  • 生命周期的统一管理,“一处修改,处处生效的作用”
  • 让第三方组件可以在自己内部随时拿到生命周期的状态,以便自己能够随时可以开启或者暂停
  • 让第三方组件在调试时 能够 更方便和安全地追踪到 事故所在的生命周期源。

原理分析

getLifecycle()
  • 点开我们的getLifecycle()方法我们可以看到,我们来到了ComponentActivity中

     @NonNull
        @Override
        public Lifecycle getLifecycle() {
            return mLifecycleRegistry;
        }
    
    • 该方法返回的是一个LifyCycleRegistry对象
    • LifecycleRegister是继承至Lifecycle的
  • 看下我们这个ComponentActivity(挑重要有关的说了)

  public class ComponentActivity extends androidx.core.app.ComponentActivity implements
       LifecycleOwner,
       ViewModelStoreOwner,
       SavedStateRegistryOwner,
       OnBackPressedDispatcherOwner {

public interface LifecycleOwner {
   /**
    * Returns the Lifecycle of the provider.
    *
    * @return The lifecycle of the provider.
    */
   @NonNull
   Lifecycle getLifecycle();
}

  • 它继承至androidx.core.app.ComponentActivity
  • 并且实现了LifecycleOwner(生命周期拥有者)
    • 其实我们的getLifecycle()方法就是实现LifcycycleOwner接口内的方法
addObserver()方法

调用的addObserver()是属于LifyCycleRegistry中的,我们先来看下LifyCycleRegistry这个类

  • 生命周期登记,它是Lifecycle的子类,起到添加观察者、响应生命周期事件、分发生命周期事件的作用

  • 部分核心源码

    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
                new FastSafeIterableMap<>();
      
    private State mState;
       
    private final WeakReference<LifecycleOwner> mLifecycleOwner;
    
    // 顺便看下 Lifecycle的源码
    public abstract class Lifecycle {
    
       
       
        @MainThread
        public abstract void addObserver(@NonNull LifecycleObserver observer);
    
      
        @MainThread
        public abstract void removeObserver(@NonNull LifecycleObserver observer);
    
        @MainThread
        @NonNull
        public abstract State getCurrentState();
    
        @SuppressWarnings("WeakerAccess")
        public enum Event {
         
            ON_CREATE,
           
            ON_START,
           
            ON_RESUME,
           
            ON_PAUSE,
           
            ON_STOP,
         
            ON_DESTROY,
          
            ON_ANY
        }
    
      
        @SuppressWarnings("WeakerAccess")
        public enum State {
      
            DESTROYED,
    
            INITIALIZED,
    
           
            CREATED,
    
            STARTED,
    
           
            RESUMED;
    
            public boolean isAtLeast(@NonNull State state) {
                return compareTo(state) >= 0;
            }
        }
    }
    
    • FastSafeIterableMap是一个Map,用来保存观察者和它对应的状态
    • mState对应着当前的状态(Lifecycle)
    • LicecycleOwner表示生命周期的拥有者,我们的ComponentActivity实现了该接口
    • 可以看到Lifecycle中有两个枚举类,分别是事件和状态,还有添加和移除观察者的方法和赶会当前Lifecycle对应的状态
  • LifyCycleRegistry # addObserver()

    @Override
        public void 
          (@NonNull LifecycleObserver observer) {
              //当前的状态是DESTROY的话,添加的Observer的初始状态就是DESTROY否则就是INITIALIZED
            State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
            //创建一个ObserverWithState,它是LifecycleRegister类中的一个静态内部类,将添加的Observer与状态关联到一起,(说白就是用它来维持Observer与State的对应关系)
            ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
            // 以observer作为key,ObserverWithState作为value存储到Map中
              //如果当前Observer对应的value不存在,就将observer与对应的value存储到map
              //否则的话就将Observer对应的value获取到并且返回当前的value
          ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
    
            if (previous != null) {
                return;
            }
            LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
            if (lifecycleOwner == null) {
                // it is null we should be destroyed. Fallback quickly
                return;
            }
    
            boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
            State targetState = calculateTargetState(observer);
            mAddingObserverCounter++;
              //注释1
            while ((statefulObserver.mState.compareTo(targetState) < 0
                    && mObserverMap.contains(observer))) {
                pushParentState(statefulObserver.mState);
                statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
                popParentState();
                // mState / subling may have been changed recalculate
                targetState = calculateTargetState(observer);
            }
    
            if (!isReentrance) {
                // we do sync only on the top level.
                sync();
            }
            mAddingObserverCounter--;
        }
    
    • 该方法是添加LifecycleObserver观察者,并且可以将之前生命状态分发给当前添加的Observer的,例如我们在Activtity的onResume之后添加这个Observer,那么该Observer依然能收到ON_CREATE事件
    • 注释一:如果Observable的初始状态是INITIALIZED,当前的状态是RESUMED,那么需要将INITIALIZED到RESUMED之间的所有事件都分发给Observer
    • 到这里我们回过头来看下 ComponentActivity
  • ComponentActivity # onCreate()

     @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mSavedStateRegistryController.performRestore(savedInstanceState);
              //注释1
            ReportFragment.injectIfNeededIn(this);
            if (mContentLayoutId != 0) {
                setContentView(mContentLayoutId);
            }
        }
    
    • 注释1:我们调用了ReportFragment # injectIfNeededIn(this)
  • ReportFragment # injectIfNeededIn()

    public static void injectIfNeededIn(Activity activity) {
            // ProcessLifecycleOwner should always correctly work and some activities may not extend
            // FragmentActivity from support lib, so we use framework fragments for activities
            android.app.FragmentManager manager = activity.getFragmentManager();
            if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
                manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
                // Hopefully, we are the first to make a transaction.
                manager.executePendingTransactions();
            }
        }
    
    • 这里我们添加了一个Fragment到Activity中
    • 并且这个Fragment是一个没有界面
    • 其实添加这个Fragment就是用来感知Activity的生命周期的
  • ReportFragment的生命周期方法

    @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            dispatchCreate(mProcessListener);
            dispatch(Lifecycle.Event.ON_CREATE);
        }
    
        @Override
        public void onStart() {
            super.onStart();
            dispatchStart(mProcessListener);
            dispatch(Lifecycle.Event.ON_START);
        }
    
        @Override
        public void onResume() {
            super.onResume();
            dispatchResume(mProcessListener);
            dispatch(Lifecycle.Event.ON_RESUME);
        }
    
        @Override
        public void onPause() {
            super.onPause();
            dispatch(Lifecycle.Event.ON_PAUSE);
        }
    
        @Override
        public void onStop() {
            super.onStop();
            dispatch(Lifecycle.Event.ON_STOP);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            dispatch(Lifecycle.Event.ON_DESTROY);
            // just want to be sure that we won't leak reference to an activity
            mProcessListener = null;
        }
    
    
    • 通过观察发现,都调用了dispatch()方法
  • ReportFragment # dispatch()方法

    private void dispatch(Lifecycle.Event event) {
            Activity activity = getActivity();
            if (activity instanceof LifecycleRegistryOwner) {
                ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
                return;
            }
    
            if (activity instanceof LifecycleOwner) {
                Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
                if (lifecycle instanceof LifecycleRegistry) {
                    ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
                }
            }
        }
    
    • 这里可以看出 有两个Owner 分别是LifecycleOwner和LifecycleRegistryOwner区别是:
      • LifecycleOwner # getLifecycle() ----> Lifecycle
      • LifecycleRegistryOwner # getLifecycle() ---> LifecycleRegister()
      • 而我们的LifecycleRegistryOwner是继承至LifecycleOwner的
    • 最终调用的都是 LifecycleRegistry #handleLifecycleEvent()的方法
  • LifecycleRegistry # handleLifecycleEvent()

     public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
            State next = getStateAfter(event);
            moveToState(next);
        }
          
          /**
          * 
          *根据事件返回我们当前的状态
          * 这个事件就是从ReportFragment中传递过来的
          */
       static State getStateAfter(Event event) {
            switch (event) {
                case ON_CREATE:
                case ON_STOP:
                    return CREATED;
                case ON_START:
                case ON_PAUSE:
                    return STARTED;
                case ON_RESUME:
                    return RESUMED;
                case ON_DESTROY:
                    return DESTROYED;
                case ON_ANY:
                    break;
            }
            throw new IllegalArgumentException("Unexpected event value " + event);
        }
    
      /**
      * 改变状态
      *
      */
      private void moveToState(State next) {
            if (mState == next) {
                return;
            }
            mState = next;
            if (mHandlingEvent || mAddingObserverCounter != 0) {
                mNewEventOccurred = true;
                // we will figure out what to do on upper level.
                return;
            }
            mHandlingEvent = true;
            sync();
            mHandlingEvent = false;
        }
    
  • LifecycleRegistry # sync()

    private void sync() {
            LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
            if (lifecycleOwner == null) {
                throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                        + "garbage collected. It is too late to change lifecycle state.");
            }
            while (!isSynced()) {
                mNewEventOccurred = false;
                // no need to check eldest for nullability, because isSynced does it for us.
                  //注释1
                if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                    backwardPass(lifecycleOwner);
                }
                Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
               //注释2
                if (!mNewEventOccurred && newest != null
                        && mState.compareTo(newest.getValue().mState) > 0) {
                    forwardPass(lifecycleOwner);
                }
            }
            mNewEventOccurred = false;
        }
    
    • 注释1:如果当前的状态值小于 Observer状态值,需要将Observer的状态值减小到和当前状态值相等。
    • 注释2:如果当前当前的状态值大于Observer的状态值,需要将Observer的状态值增大到和当前状态值相等。
  • LifecycleRegistry # backwardPass

    private void backwardPass(LifecycleOwner lifecycleOwner) {
            Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                    mObserverMap.descendingIterator();
            while (descendingIterator.hasNext() && !mNewEventOccurred) {
                Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
                ObserverWithState observer = entry.getValue();
                while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                        && mObserverMap.contains(entry.getKey()))) {
                    Event event = downEvent(observer.mState);
                    pushParentState(getStateAfter(event));
                    observer.dispatchEvent(lifecycleOwner, event);
                    popParentState();
                }
            }
        }
    
    • 对应着sync中注释1的代码
  • LifecycleRegistry # forwardPass

    private void forwardPass(LifecycleOwner lifecycleOwner) {
            Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                    mObserverMap.iteratorWithAdditions();
            while (ascendingIterator.hasNext() && !mNewEventOccurred) {
                Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
                ObserverWithState observer = entry.getValue();
                while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                        && mObserverMap.contains(entry.getKey()))) {
                    pushParentState(observer.mState);
                    observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                    popParentState();
                }
            }
        }
    
    • 对应着sync注释2的代码
  • 在上述的两段代码中。(forwardPass和backwarPass)在调整State时,都调用了 observer # dispatchEvent()

    • Observer ---> ObserverWithState
  • LifecycleRegistry # ObserverWithState # dispatchEvent()

     void dispatchEvent(LifecycleOwner owner, Event event) {
                State newState = getStateAfter(event);
                mState = min(mState, newState);
                mLifecycleObserver.onStateChanged(owner, event);
                mState = newState;
            }
    
    • 在此方法中我们调用了 LifecycleEventObserver的onStateChange方法
    • 那么这个LifecycleEventObserver时怎么来的呢?
    • 在上文中 我们在LifecycleRegistry # addObserver()方法中我们构建了一个ObserverWithState(),我们看下ObserverWithState()的构造方法
  • ObserverWithState()

    
    ObserverWithState(LifecycleObserver observer, State initialState) {
                mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
                mState = initialState;
     }
    
    • 可以看到我们的mLifecycleObserver对象时通过 Lifecycling.lifecycleEventObserver(observer);获取到的
  • Lifecycling # lifecycleEventObserver()

    @NonNull
        static LifecycleEventObserver lifecycleEventObserver(Object object) {
              // 我们传入的object是我们自定义的MyObservable
              // 这里面 LifecycleEventObserver extends LifecycleObserver
              // FullLifecycleObserver extends LifecycleObserver
              // 对于instanceof关键字 左面是类的引用,右面是一个接口或者一个类 的类型
              // 返回true的情况,左边的引用类型是右边类型的,或者是是其子类,或者是实现类的类型
              // 针对这里的情况,好像都不是
              // isLifecycleEventObserver ==  false
              // isFullLifecycleObserver == false
            boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
            boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
            if (isLifecycleEventObserver && isFullLifecycleObserver) {
                return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
                        (LifecycleEventObserver) object);
            }
            if (isFullLifecycleObserver) {
                return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
            }
    
            if (isLifecycleEventObserver) {
                return (LifecycleEventObserver) object;
            }
    
            final Class<?> klass = object.getClass();
            int type = getObserverConstructorType(klass);
            if (type == GENERATED_CALLBACK) {
                List<Constructor<? extends GeneratedAdapter>> constructors =
                        sClassToAdapters.get(klass);
                if (constructors.size() == 1) {
                    GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                            constructors.get(0), object);
                    return new SingleGeneratedAdapterObserver(generatedAdapter);
                }
                GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
                for (int i = 0; i < constructors.size(); i++) {
                    adapters[i] = createGeneratedAdapter(constructors.get(i), object);
                }
                return new CompositeGeneratedAdaptersObserver(adapters);
            }
            return new ReflectiveGenericLifecycleObserver(object);
        }
    
    • 针对上述的分析,我们可以知道,lifecycleEventObserver()方法真正我们需要的是如下代码
    final Class<?> klass = object.getClass();
                  // 获取到的type=1
            int type = getObserverConstructorType(klass);
                  // GENERATED_CALLBACK == 2
            if (type == GENERATED_CALLBACK) {
                List<Constructor<? extends GeneratedAdapter>> constructors =
                        sClassToAdapters.get(klass);
                if (constructors.size() == 1) {
                    GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                            constructors.get(0), object);
                    return new SingleGeneratedAdapterObserver(generatedAdapter);
                }
                GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
                for (int i = 0; i < constructors.size(); i++) {
                    adapters[i] = createGeneratedAdapter(constructors.get(i), object);
                }
                return new CompositeGeneratedAdaptersObserver(adapters);
            }
            return new ReflectiveGenericLifecycleObserver(object);
    
    • 经过上述分析,可以看出返回的是 ReflectiveGenericLifecycleObserver()
  • ReflectiveGenericLifecycleObserver

    class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
        private final Object mWrapped;
        private final CallbackInfo mInfo;
    
        ReflectiveGenericLifecycleObserver(Object wrapped) {
            mWrapped = wrapped;
            mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
        }
    
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) {
            mInfo.invokeCallbacks(source, event, mWrapped);
        }
    }
    
     @SuppressWarnings("ConstantConditions")
            void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
                invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
                invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
                        target);
            }
    
            private static void invokeMethodsForEvent(List<MethodReference> handlers,
                    LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
                if (handlers != null) {
                    for (int i = handlers.size() - 1; i >= 0; i--) {
                        handlers.get(i).invokeCallback(source, event, mWrapped);
                    }
                }
            }
        }
    
     void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
                //noinspection TryWithIdenticalCatches
                try {
                    switch (mCallType) {
                        case CALL_TYPE_NO_ARG:
                            mMethod.invoke(target);
                            break;
                        case CALL_TYPE_PROVIDER:
                            mMethod.invoke(target, source);
                            break;
                        case CALL_TYPE_PROVIDER_WITH_EVENT:
                            mMethod.invoke(target, source, event);
                            break;
                    }
                } catch (InvocationTargetException e) {
                    throw new RuntimeException("Failed to call observer method", e.getCause());
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
    
    • 根据调用事件线走下去,调用了ReflectiveGenericLifecycleObserver的onStateChanged()
    • 继而从invokeCallbacks() ---> invokeMethodsForEvent() ---> invokeCallback()
    • 当生命周期发生改变的时候,最终通过反射(ReflectiveGenericLifecycleObserver存储了我们在 Observer 里注解的方法)调用了我们在观察者中利用注解声明的方法。
总结
  • Lifecycle将Activity的生命周期函数对应成Event,生命周期改变,会将Event传递给LifecycleRegistry,LifecycleRegistry中会修正State的值,并且触发事件的分发,通过反射通知到LifecycleObsever中接受事件的方法。
  • 基于观察者模式,将第三方组件以观察者的形式在生命周期拥有者中通过addObserver()方法添加到List/Map中,当生命周期的拥有者发生生命周期变化的时候,通过生命事件分发者(LifecycleRegister)遍历集合中的观察者,执行对应的生命周期方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335