Android 中級(jí)圣經(jīng)系列之Activity

該系列文章主要介紹android里基本組件的了解和使用

圣經(jīng)?該系列文章將以標(biāo)簽的形式添加,在以后的工作中也會(huì)不斷完善,也希望有其他朋友補(bǔ)充,最終希望能讓閱讀的人通過一篇文章就能解決了解與這組件相關(guān)的大部分問題,比如說第一篇Activity,除了常見的生命周期外,還會(huì)介紹activity的創(chuàng)建過程,啟動(dòng)模式等等

中級(jí)?如果要把a(bǔ)ndroid工程師分初中高三個(gè)等級(jí)的話,個(gè)人覺得應(yīng)該達(dá)到以下要求


初級(jí):能熟練使用android的view控件和activity,靈活得在前臺(tái)后臺(tái)線程進(jìn)行切換,根據(jù)產(chǎn)品需求,完成ui層面的任務(wù)


中級(jí):熟練使用android四大組件,初步理解背后實(shí)現(xiàn)的機(jī)制和原理,理解事件分發(fā)三大關(guān)鍵函數(shù)dispatchTouchEven,onInterceptTouchEvent,onTouchEvent,能夠解決大部分父子節(jié)點(diǎn)事件傳遞的問題,理解NestedScroll(嵌套滑動(dòng)接口),熟悉view的繪制流程(onMeasure-》onLayout-》onDraw)及這三個(gè)函數(shù)在view和viewgroup之間的不同點(diǎn),能熟練得自定義view。


高級(jí):看過并理解view的源碼,對(duì)于自定義view之類的不再覺得是問題,研究理解優(yōu)秀的android框架,比如Fresco(圖片加載),Volley(網(wǎng)絡(luò)請(qǐng)求),需要時(shí)可以自己開發(fā)簡(jiǎn)化版,游刃有余地處理內(nèi)存的使用和回收,處理不同線程的并發(fā)情況,能在項(xiàng)目中運(yùn)用合適的開發(fā)模式。


希望通過這系列教程和自己的實(shí)踐,能讓大家達(dá)到中級(jí)的開發(fā)水平

Activity生命周期(地球人都知道),但你知不知道onPause和onStop的區(qū)別?為什么要存在兩個(gè)不同的回調(diào)?onDestory實(shí)際上做了什么?

當(dāng)當(dāng)前activity失去焦點(diǎn)時(shí),會(huì)馬上觸發(fā)onPause(比如跳轉(zhuǎn)到新的activitiy,切到后臺(tái)),之后過一段時(shí)間后假如檢測(cè)改activity依然在后臺(tái),此時(shí)才會(huì)觸發(fā)onStop。

當(dāng)新打開的Activity是Dialog風(fēng)格時(shí)或者是透明時(shí);這兩種情況只會(huì)調(diào)用onPause方法,但不會(huì)調(diào)用onStop方法。

銷毀activity時(shí)如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)Activity,而不會(huì)觸發(fā) onStop 方法。所以保存臨時(shí)數(shù)據(jù)的方法必須放在onPause做,而不是onStop。

onDestroy實(shí)際上并沒有馬上把a(bǔ)ctivity銷毀,而是把該activity從當(dāng)前的activity棧中移除,大多數(shù) app并不需要實(shí)現(xiàn)這個(gè)方法,因?yàn)榫植款惖膔eferences會(huì)隨著activity的銷毀而銷毀,但是加入這個(gè)時(shí)候你的activity被其他地方強(qiáng)引用(例如有個(gè)動(dòng)畫不斷在執(zhí)行),這時(shí)候你會(huì)發(fā)現(xiàn)在即使onDestroy被調(diào)用,但是改activity依然存在系統(tǒng)的內(nèi)存中,所以單單依靠這個(gè)函數(shù)來回收資源是不夠的。

順便說一下Fragment的生命周期

Fragment是和activity綁定的,但創(chuàng)建時(shí)首先會(huì)觸發(fā)onAttach,此時(shí)可以獲取到context對(duì)象,
onAttach方法:Fragment和Activity建立關(guān)聯(lián)的時(shí)候調(diào)用。
onCreateView方法:為Fragment加載布局時(shí)調(diào)用。
onActivityCreated方法:當(dāng)Activity中的onCreate方法執(zhí)行完后調(diào)用。
onDestroyView方法:Fragment中的布局被移除時(shí)調(diào)用。
onDetach方法:Fragment和Activity解除關(guān)聯(lián)的時(shí)候調(diào)用。

activity為什么要細(xì)化出onCreate、onStart、onResume、onPause、onStop、onDesdroy?相信很多人為這個(gè)問題困擾很久,先來看一個(gè)圖,從Activity A跳轉(zhuǎn)到Activity B的回調(diào)順序

可以發(fā)現(xiàn)跳轉(zhuǎn)發(fā)生時(shí),先調(diào)用了A的onPause,之后等到B的onStart和onResume完成后才調(diào)用A的onStop,這樣設(shè)計(jì)的目的在于讓開發(fā)者可以在不同階段進(jìn)行不同資源的釋放或者創(chuàng)建,舉個(gè)例子,先看下onResume的官方定義
void android.app.Activity.onResume()
Called after onRestoreInstanceState, onRestart, or onPause, for your activity to start interacting with the user. This is a good place to begin animations, open exclusive-access devices (such as the camera), etc.

Keep in mind that onResume is not the best indicator that your activity is visible to the user; a system window such as the keyguard may be in front. Use onWindowFocusChanged to know for certain that your activity is visible to the user (for example, to resume a game).

“open exclusive-access devices (such as the camera)",比如你的應(yīng)用有打開camera的操作,假如camera的初始化你放到了onCreate里面,釋放放到了onStop或者onDestroy里面,假設(shè)A和B都需要camera的資源,那么當(dāng)A跳轉(zhuǎn)到B時(shí),B在oncreate創(chuàng)建camera引用,就會(huì)出現(xiàn)A里面的camera還沒有釋放的問題,所以google建議是在onResume()中打開獨(dú)占設(shè)備(比如相機(jī)),在onpause里把這些資源釋放出去。

所有的初始化都在onCreate()中實(shí)現(xiàn)?
onCreate()代表activity被創(chuàng)建,onStart代表該Activity變成可見狀態(tài),Activity的onCreate()被調(diào)用時(shí),Activity還不可見,如果要做一些動(dòng)畫,既然視圖還不存在,在onCreate中來啟動(dòng)動(dòng)畫,明顯有問題;

其次,A Activity 切換到 B Activity,再切換到 A Activity,由于實(shí)例已經(jīng)存在,所以onCreate不會(huì)再被調(diào)用,那AActivity從后臺(tái)切換至前臺(tái)時(shí),有可能需要一些初始化,那就沒法再被調(diào)用到了;

所有的初始化都在onStart()中實(shí)現(xiàn)?
onStart() 被調(diào)用時(shí),Activity可能是可見了,但還不是可交互的,onResume()的注釋中都明確地說了這不是Activity對(duì)用戶是可見的最好的指示器,onStart() 在這之前被調(diào)用,那有一些特殊的初始化相關(guān)的邏輯在這里被調(diào)用也會(huì)有問題。

這只是很簡(jiǎn)單的例子,實(shí)際中要根據(jù)實(shí)際情況處理,總的來說可以把一些view的初始化工作放到onCreate里面,在onstart時(shí)可以開啟一些動(dòng)畫事件,最后在onresume時(shí)才打開獨(dú)占設(shè)備,在onpause時(shí)把動(dòng)畫停止,獨(dú)占設(shè)備的資源釋放出去,停止網(wǎng)絡(luò)輪詢,而不是onStop,最后看一下官方解釋:
void android.app.Activity.onStop()
Called when you are no longer visible to the user. You will next receive either onRestart, onDestroy, or nothing, depending on later user activity.
Note that this method may never be called, in low memory situations where the system does not have enough memory to keep your activity's process running after its onPause method is called.
onStop() 的注釋中明確地寫了,在內(nèi)存不足而導(dǎo)致系統(tǒng)無法保留此進(jìn)程的情況下,onStop() 可能都不會(huì)被執(zhí)行。

Acitity啟動(dòng)模式:
涉及關(guān)鍵詞“LaunchMode",”Task stack“,“intent”,由于intent我們之后還有一篇文章專門來講,所以主要看前面兩個(gè)。

LauchMode有四種,分別為standard,singleTop,singleTask,singleInstance,可以在xml里面配置好,也可以在startactivity啟動(dòng)時(shí)設(shè)定,后者優(yōu)先級(jí)高于前者。在這里先記錄一下官方的定義

"standard":Default. The system always creates a new instance of the activity in the target task and routes the intent to it.

"singleTop":If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to itsonNewIntent()method, rather than creating a new instance of the activity.

"singleTask":The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to itsonNewIntent()method, rather than creating a new one.

"singleInstance":Same as "singleTask", except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task.

這里注意一點(diǎn),就是singleTop其實(shí)是并不一定保證唯一性的,比如一個(gè)視頻播放的activity,當(dāng)點(diǎn)擊home健退到后臺(tái)后,通過點(diǎn)擊notification到splash頁面再回來這個(gè)activity,其實(shí)已經(jīng)不是之前那一個(gè)了,已有的信息會(huì)被刪除掉。這種情況可以考慮使用singletask

接著看一下startactivity時(shí)可以設(shè)置的flag有哪些:

FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個(gè)標(biāo)志一般不是由程序代碼設(shè)置的,如在launchMode中設(shè)置singleTask模式時(shí)系統(tǒng)幫你設(shè)定。

FLAG_ACTIVITY_SINGLE_TOP
如果設(shè)置,當(dāng)這個(gè)Activity位于歷史stack的頂端運(yùn)行時(shí),不再啟動(dòng)一個(gè)新的。

FLAG_ACTIVITY_NEW_TASK
如果設(shè)置,這個(gè)Activity會(huì)成為歷史stack中一個(gè)新Task的開始。一個(gè)Task(從啟動(dòng)它的Activity到下一個(gè)Task中的 Activity)定義了用戶可以遷移的Activity原子組。Task可以移動(dòng)到前臺(tái)和后臺(tái);在某個(gè)特定Task中的所有Activity總是保持相同的次序。

這個(gè)標(biāo)志一般用于呈現(xiàn)“啟動(dòng)”類型的行為:它們提供用戶一系列可以單獨(dú)完成的事情,與啟動(dòng)它們的Activity完全無關(guān)。

使用這個(gè)標(biāo)志,如果正在啟動(dòng)的Activity的Task已經(jīng)在運(yùn)行的話,那么,新的Activity將不會(huì)啟動(dòng);代替的,當(dāng)前Task會(huì)簡(jiǎn)單的移入前臺(tái)。參考FLAG_ACTIVITY_MULTIPLE_TASK標(biāo)志,可以禁用這一行為

這個(gè)標(biāo)志不能用于調(diào)用方對(duì)已經(jīng)啟動(dòng)的Activity請(qǐng)求結(jié)果。

FLAG_ACTIVITY_CLEAR_TOP(top的意思是指蓋在該activity上面,比他遲創(chuàng)建啟動(dòng)的)
如果設(shè)置,并且這個(gè)Activity已經(jīng)在當(dāng)前的Task中運(yùn)行,因此,不再是重新啟動(dòng)一個(gè)這個(gè)Activity的實(shí)例,而是在這個(gè)Activity上方的所有Activity都將關(guān)閉,然后這個(gè)Intent會(huì)作為一個(gè)新的Intent投遞到老的Activity(現(xiàn)在位于頂端)中。

例如,假設(shè)一個(gè)Task中包含這些Activity:A,B,C,D。如果D調(diào)用了startActivity(),并且包含一個(gè)指向Activity B的Intent,那么,C和D都將結(jié)束,然后B接收到這個(gè)Intent,因此,目前stack的狀況是:A,B。

上例中正在運(yùn)行的Activity B既可以在onNewIntent()中接收到這個(gè)新的Intent,也可以把自己關(guān)閉然后重新啟動(dòng)來接收這個(gè)Intent。如果它的啟動(dòng)模式聲明為 “multiple”(默認(rèn)值),并且你沒有在這個(gè)Intent中設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)志,那么它將關(guān)閉然后重新創(chuàng)建;對(duì)于其它的啟動(dòng)模式,或者在這個(gè)Intent中設(shè)置FLAG_ACTIVITY_SINGLE_TOP標(biāo)志,都將把這個(gè)Intent投遞到當(dāng)前這個(gè)實(shí)例的onNewIntent()中。

這個(gè)啟動(dòng)模式還可以與FLAG_ACTIVITY_NEW_TASK結(jié)合起來使用:用于啟動(dòng)一個(gè)Task中的根Activity,它會(huì)把那個(gè)Task中任何運(yùn)行的實(shí)例帶入前臺(tái),然后清除它直到根Activity。這非常有用,例如,當(dāng)從Notification Manager處啟動(dòng)一個(gè)Activity。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
如果設(shè)置,這將在Task的Activity stack中設(shè)置一個(gè)還原點(diǎn),當(dāng)Task恢復(fù)時(shí),需要清理Activity。也就是說,下一次Task帶著 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記進(jìn)入前臺(tái)時(shí)(典型的操作是用戶在主畫面重啟它),這個(gè)Activity和它之上的都將關(guān)閉,以至于用戶不能再返回到它們,但是可以回到之前的Activity。

這在你的程序有分割點(diǎn)的時(shí)候很有用。例如,一個(gè)e-mail應(yīng)用程序可能有一個(gè)操作是查看一個(gè)附件,需要啟動(dòng)圖片瀏覽Activity來顯示。這個(gè) Activity應(yīng)該作為e-mail應(yīng)用程序Task的一部分,因?yàn)檫@是用戶在這個(gè)Task中觸發(fā)的操作。然而,當(dāng)用戶離開這個(gè)Task,然后從主畫面選擇e-mail app,我們可能希望回到查看的會(huì)話中,但不是查看圖片附件,因?yàn)檫@讓人困惑。通過在啟動(dòng)圖片瀏覽時(shí)設(shè)定這個(gè)標(biāo)志,瀏覽及其它啟動(dòng)的Activity在下次用戶返回到mail程序時(shí)都將全部清除。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果設(shè)置,新的Activity不會(huì)在最近啟動(dòng)的Activity的列表中保存。

FLAG_ACTIVITY_FORWARD_RESULT
如果設(shè)置,并且這個(gè)Intent用于從一個(gè)存在的Activity啟動(dòng)一個(gè)新的Activity,那么,這個(gè)作為答復(fù)目標(biāo)的Activity將會(huì)傳到這個(gè)新的Activity中。這種方式下,新的Activity可以調(diào)用setResult(int),并且這個(gè)結(jié)果值將發(fā)送給那個(gè)作為答復(fù)目標(biāo)的 Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
這個(gè)標(biāo)志一般不由應(yīng)用程序代碼設(shè)置,如果這個(gè)Activity是從歷史記錄里啟動(dòng)的(常按HOME鍵),那么,系統(tǒng)會(huì)幫你設(shè)定。

FLAG_ACTIVITY_MULTIPLE_TASK
不要使用這個(gè)標(biāo)志,除非你自己實(shí)現(xiàn)了應(yīng)用程序啟動(dòng)器。與FLAG_ACTIVITY_NEW_TASK結(jié)合起來使用,可以禁用把已存的Task送入前臺(tái)的行為。當(dāng)設(shè)置時(shí),新的Task總是會(huì)啟動(dòng)來處理Intent,而不管這是是否已經(jīng)有一個(gè)Task可以處理相同的事情。

由于默認(rèn)的系統(tǒng)不包含圖形Task管理功能,因此,你不應(yīng)該使用這個(gè)標(biāo)志,除非你提供給用戶一種方式可以返回到已經(jīng)啟動(dòng)的Task。

如果FLAG_ACTIVITY_NEW_TASK標(biāo)志沒有設(shè)置,這個(gè)標(biāo)志被忽略。

FLAG_ACTIVITY_NO_ANIMATION
如果在Intent中設(shè)置,并傳遞給Context.startActivity()的話,這個(gè)標(biāo)志將阻止系統(tǒng)進(jìn)入下一個(gè)Activity時(shí)應(yīng)用 Acitivity遷移動(dòng)畫。這并不意味著動(dòng)畫將永不運(yùn)行——如果另一個(gè)Activity在啟動(dòng)顯示之前,沒有指定這個(gè)標(biāo)志,那么,動(dòng)畫將被應(yīng)用。這個(gè)標(biāo)志可以很好的用于執(zhí)行一連串的操作,而動(dòng)畫被看作是更高一級(jí)的事件的驅(qū)動(dòng)。

FLAG_ACTIVITY_NO_HISTORY
如果設(shè)置,新的Activity將不再歷史stack中保留。用戶一離開它,這個(gè)Activity就關(guān)閉了。這也可以通過設(shè)置noHistory特性。

FLAG_ACTIVITY_NO_USER_ACTION

如果設(shè)置,作為新啟動(dòng)的Activity進(jìn)入前臺(tái)時(shí),這個(gè)標(biāo)志將在Activity暫停之前阻止從最前方的Activity回調(diào)的onUserLeaveHint()。

典型的,一個(gè)Activity可以依賴這個(gè)回調(diào)指明顯式的用戶動(dòng)作引起的Activity移出后臺(tái)。這個(gè)回調(diào)在Activity的生命周期中標(biāo)記一個(gè)合適的點(diǎn),并關(guān)閉一些Notification。

如果一個(gè)Activity通過非用戶驅(qū)動(dòng)的事件,如來電或鬧鐘,啟動(dòng)的,這個(gè)標(biāo)志也應(yīng)該傳遞給Context.startActivity,保證暫停的Activity不認(rèn)為用戶已經(jīng)知曉其Notification。

FLAG_ACTIVITY_REORDER_TO_FRONT
如果在Intent中設(shè)置,并傳遞給Context.startActivity(),這個(gè)標(biāo)志將引發(fā)已經(jīng)運(yùn)行的Activity移動(dòng)到歷史stack的頂端。

例如,假設(shè)一個(gè)Task由四個(gè)Activity組成:A,B,C,D。如果D調(diào)用startActivity()來啟動(dòng)Activity B,那么,B會(huì)移動(dòng)到歷史stack的頂端,現(xiàn)在的次序變成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP標(biāo)志也設(shè)置的話,那么這個(gè)標(biāo)志將被忽略。

Activity是運(yùn)行在『所需的任務(wù)棧』,什么是Activity所需的任務(wù)棧?這里就要提一個(gè)參數(shù):TaskAffinity。這個(gè)參數(shù)標(biāo)識(shí)了一個(gè)Activity所需的任務(wù)棧的名字,默認(rèn)情況下所有的Activity所需的任務(wù)棧都是當(dāng)前包名,當(dāng)然我們也可以為每個(gè)Activity單獨(dú)指定TaskAffinity,注意這個(gè)屬性值必須不能和包名相同,TaskAffinity主要和singleTask配合使用,否則的話沒什么意義。當(dāng)啟動(dòng)一個(gè)被TaskAffinity標(biāo)識(shí)了的Activity,那么該Activity就會(huì)運(yùn)行在和TaskAffinity相同的任務(wù)棧中



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容