ANDROID 系統(tǒng)下載

Android 2.3(API level 9)開始Android用系統(tǒng)服務(wù)(Service)的方式提供了Download Manager來優(yōu)化處理長(zhǎng)時(shí)間的下載操作桐臊。Download Manager處理HTTP
連接并監(jiān)控連接中的狀態(tài)變化以及系統(tǒng)重啟來確保每一個(gè)下載任務(wù)順利完成。
在大多數(shù)涉及到下載的情況中使用Download Manager都是不錯(cuò)的選擇唬滑,特別是當(dāng)用戶切換不同的應(yīng)用以后下載需要在后臺(tái)繼續(xù)進(jìn)行敲霍,以及當(dāng)下載任務(wù)順利完成非常重要的情況(DownloadManager對(duì)于斷點(diǎn)續(xù)傳功能支持很好)背传。

一膘格、DownloadManager簡(jiǎn)單介紹

DownloadManager是系統(tǒng)開放給第三方應(yīng)用使用的類,包含兩個(gè)靜態(tài)內(nèi)部類DownloadManager.Query和DownloadManager.Request萝嘁。DownloadManager.Request用來請(qǐng)求一個(gè)下載梆掸,DownloadManager.Query用來查詢下載信息,這兩個(gè)類的具體功能會(huì)在后面穿插介紹牙言。DownloadManager的源碼可見DownloadManager@Grepcode酸钦。

DownloadManager主要提供了下面幾個(gè)接口:public long enqueue(Request request)執(zhí)行下載,返回downloadId咱枉,downloadId可用于后面查詢下載信息卑硫。若網(wǎng)絡(luò)不滿足條件、Sdcard掛載中蚕断、超過最大并發(fā)數(shù)等異常會(huì)等待下載欢伏,正常則直接下載。public int remove(long… ids)刪除下載亿乳,若下載中取消下載硝拧。會(huì)同時(shí)刪除下載文件和記錄。public Cursor query(Query query)查詢下載信息葛假。

public static Long getRecommendedMaxBytesOverMobile(Context context通過移動(dòng)網(wǎng)絡(luò)下載的最大字節(jié)數(shù)public String getMimeTypeForDownloadedFile(long id)得到下載的mimeType障陶,如何設(shè)置后面會(huì)進(jìn)行介紹

其它:通過查看代碼我們可以發(fā)現(xiàn)還有個(gè)CursorTranslator私有靜態(tài)內(nèi)部類。這個(gè)類主要對(duì)Query做了一層代理聊训。將DownloadProvider和DownloadManager之間做個(gè)映射咸这。將DownloadProvider中的十幾種狀態(tài)對(duì)應(yīng)到了DownloadManager中的五種狀態(tài),DownloadProvider中的失敗魔眨、暫停原因轉(zhuǎn)換為了DownloadManager的原因媳维。

簡(jiǎn)單使用

完成一個(gè)下載任務(wù)只需要4行代碼,什么斷點(diǎn)續(xù)傳遏暴,大文件下載侄刽,通知欄進(jìn)度顯示....都不需要你操心。

//創(chuàng)建下載任務(wù),downloadUrl就是下載鏈接
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));
//指定下載路徑和下載文件名
request.setDestinationInExternalPublicDir("/download/", fileName);
//獲取下載管理器
DownloadManager downloadManager= (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
//將下載任務(wù)加入下載隊(duì)列朋凉,否則不會(huì)進(jìn)行下載
downloadManager.enqueue(request);

高級(jí)用法

具體的使用方法

要想使用Download Manager州丹,使用getSystemService方法請(qǐng)求系統(tǒng)的DOWNLOAD_SERVICE服務(wù),代碼片段如下

//創(chuàng)建下載任務(wù) DownloadManager.Request request = new DownloadManager.Request(Uri.parse(versionUrl)); request.setAllowedOverRoaming(false);//漫游網(wǎng)絡(luò)是否可以下載 //設(shè)置文件類型杂彭,可以在下載結(jié)束后自動(dòng)打開該文件 MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(versionUrl)); request.setMimeType(mimeString); //在通知欄中顯示墓毒,默認(rèn)就是顯示的 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); request.setVisibleInDownloadsUi(true); //sdcard的目錄下的download文件夾,必須設(shè)置 request.setDestinationInExternalPublicDir("/download/", versionName); //request.setDestinationInExternalFilesDir(),也可以自己制定下載路徑 //將下載請(qǐng)求加入下載隊(duì)列 downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); //加入下載隊(duì)列后會(huì)給該任務(wù)返回一個(gè)long型的id亲怠, //通過該id可以取消任務(wù)所计,重啟任務(wù)等等,看上面源碼中框起來的方法 mTaskId = downloadManager.enqueue(request);

要請(qǐng)求一個(gè)下載操作团秽,需要?jiǎng)?chuàng)建一個(gè)DownloadManager.Request對(duì)象主胧,將要請(qǐng)求下載的文件的Uri傳遞給Download Manager的enqueue方法

String serviceString = Context.DOWNLOAD_SERVICE; 
DownloadManager downloadManager; 
downloadManager = (DownloadManager)getSystemService(serviceString); 
Uri uri = Uri.parse("http://developer.android.com/shareables/icon_templates-v4.0.zip"); 
DownloadManager.Request request = new Request(uri); 
long reference = downloadManager.enqueue(request); 
String serviceString = Context.DOWNLOAD_SERVICE;  
DownloadManager downloadManager;  
downloadManager = (DownloadManager)getSystemService(serviceString);  
  
Uri uri = Uri.parse("http://developer.android.com/shareables/icon_templates-v4.0.zip");  
DownloadManager.Request request = new Request(uri);  
long reference = downloadManager.enqueue(request);  

在這里返回的reference變量是系統(tǒng)為當(dāng)前的下載請(qǐng)求分配的一個(gè)唯一的ID叭首,我們可以通過這個(gè)ID重新獲得這個(gè)下載任務(wù),進(jìn)行一些自己想要進(jìn)行的操作或者查詢
下載的狀態(tài)以及取消下載等等踪栋。

我們可以通過addRequestHeader方法為DownloadManager.Request對(duì)象request添加HTTP頭焙格,也可以通過setMimeType方法重寫從服務(wù)器返回的mime type。
我們還可以指定在什么連接狀態(tài)下執(zhí)行下載操作夷都。setAllowedNetworkTypes方法可以用來限定在WiFi還是手機(jī)網(wǎng)絡(luò)下進(jìn)行下載眷唉,setAllowedOverRoaming方法
可以用來阻止手機(jī)在漫游狀態(tài)下下載。
下面的代碼片段用于指定一個(gè)較大的文件只能在WiFi下進(jìn)行下載:

request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 

Android API level 11 介紹了getRecommendedMaxBytesOverMobile類方法(靜態(tài)方法)囤官,返回一個(gè)當(dāng)前手機(jī)網(wǎng)絡(luò)連接下的最大建議字節(jié)數(shù)冬阳,可以來判斷下載
是否應(yīng)該限定在WiFi條件下。
調(diào)用enqueue方法之后治拿,只要數(shù)據(jù)連接可用并且Download Manager可用摩泪,下載就會(huì)開始笆焰。
要在下載完成的時(shí)候獲得一個(gè)系統(tǒng)通知(notification),注冊(cè)一個(gè)廣播接受者來接收ACTION_DOWNLOAD_COMPLETE廣播劫谅,這個(gè)廣播會(huì)包含一個(gè)
EXTRA_DOWNLOAD_ID信息在intent中包含了已經(jīng)完成的這個(gè)下載的ID,代碼片段如下所示:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);  
BroadcastReceiver receiver = new BroadcastReceiver() {  
  @Override  
  public void onReceive(Context context, Intent intent) {  
    long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);  
    if (myDownloadReference == reference) {  
       
    }  
  }  
};  
registerReceiver(receiver, filter);  
```
>使用Download Manager的openDownloadedFile方法可以打開一個(gè)已經(jīng)下載完成的文件,返回一個(gè)ParcelFileDescriptor對(duì)象嚷掠。我們可以通過Download Manager來
查詢下載文件的保存地址捏检,如果在下載時(shí)制定了路徑和文件名,我們也可以直接操作文件不皆。
我們可以為ACTION_NOTIFICATION_CLICKED action注冊(cè)一個(gè)廣播接受者贯城,當(dāng)用戶從通知欄點(diǎn)擊了一個(gè)下載項(xiàng)目或者從Downloads app點(diǎn)擊可一個(gè)下載的項(xiàng)目的
時(shí)候,系統(tǒng)就會(huì)發(fā)出一個(gè)點(diǎn)擊下載項(xiàng)的廣播霹娄。
代碼片段如下:

```
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);  
BroadcastReceiver receiver = new BroadcastReceiver() {  
  @Override  
  public void onReceive(Context context, Intent intent) {  
    String extraID = DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS;  
    long[] references = intent.getLongArrayExtra(extraID);  
    for (long reference : references)  
      if (reference == myDownloadReference) {  
        // Do something with downloading file.  
      }  
  }  
};  
registerReceiver(receiver, filter);  
```
####定制Download Manager Notifications的樣式

>默認(rèn)情況下能犯,通知欄中會(huì)顯示被Download Manager管理的每一個(gè)download每一個(gè)Notification會(huì)顯示當(dāng)前的下載進(jìn)度和文件的名字,如下圖所示:
通過Download Manager可以為每一個(gè)download request定制Notification的樣式犬耻,包括完全隱藏Notification踩晶。下面的代碼片段顯示了通過setTitle和setDescription
方法來定制顯示在文件下載Notification中顯示的文字。

```
request.setTitle(“Earthquakes”);  
request.setDescription(“Earthquake XML”);  
```

>setNotificationVisibility方法可以用來控制什么時(shí)候顯示Notification枕磁,甚至是隱藏該request的Notification渡蜻。有以下幾個(gè)參數(shù):
**Request.VISIBILITY_VISIBLE**:在下載進(jìn)行的過程中,通知欄中會(huì)一直顯示該下載的Notification计济,當(dāng)下載完成時(shí)茸苇,該Notification會(huì)被移除,這是默認(rèn)的參數(shù)值沦寂。
**Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED**:在下載過程中通知欄會(huì)一直顯示該下載的Notification学密,在下載完成后該Notification會(huì)繼續(xù)顯示,直到用戶點(diǎn)擊該
Notification或者消除該Notification传藏。
**Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION**:只有在下載完成后該Notification才會(huì)被顯示则果。
**Request.VISIBILITY_HIDDEN**:不顯示該下載請(qǐng)求的Notification幔翰。如果要使用這個(gè)參數(shù),需要在應(yīng)用的清單文件中加上DOWNLOAD_WITHOUT_NOTIFICATION權(quán)限西壮。
指定下載保存地址
默認(rèn)情況下遗增,所有通過Download Manager下載的文件都保存在一個(gè)共享下載緩存中款青,使用系統(tǒng)生成的文件名每一個(gè)Request對(duì)象都可以制定一個(gè)下載
保存的地址,通常情況下抡草,所有的下載文件都應(yīng)該保存在外部存儲(chǔ)中,所以我們需要在應(yīng)用清單文件中加上WRITE_EXTERNAL_STORAGE權(quán)限:

```
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>  
```
>下面的代碼片段是在外部存儲(chǔ)中指定一個(gè)任意的保存位置的方法:

```
request.setDestinationUri(Uri.fromFile(f));  
```
> f是一個(gè)File對(duì)象康震。
如果下載的這個(gè)文件是你的應(yīng)用所專用的,你可能會(huì)希望把這個(gè)文件放在你的應(yīng)用在外部存儲(chǔ)中的一個(gè)專有文件夾中腿短。注意這個(gè)文件夾不提供訪問控制,
所以其他的應(yīng)用也可以訪問這個(gè)文件夾橘忱。在這種情況下赴魁,如果你的應(yīng)用卸載了颖御,那么在這個(gè)文件夾也會(huì)被刪除。
下面的代碼片段是指定存儲(chǔ)文件的路徑是應(yīng)用在外部存儲(chǔ)中的專用文件夾的方法:

```
request.setDestinationInExternalFilesDir(this,  
  Environment.DIRECTORY_DOWNLOADS, “Bugdroid.png”);  
```

>如果下載的文件希望被其他的應(yīng)用共享凝颇,特別是那些你下載下來希望被Media Scanner掃描到的文件(比如音樂文件),那么你可以指定你的下載路徑在
外部存儲(chǔ)的公共文件夾之下拧略,下面的代碼片段是將文件存放到外部存儲(chǔ)中的公共音樂文件夾的方法:

```
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC,  
  "Android_Rock.mp3");  
```
>在默認(rèn)的情況下,通過Download Manager下載的文件是不能被Media Scanner掃描到的辑鲤,進(jìn)而這些下載的文件(音樂、視頻等)就不會(huì)在Gallery和
Music Player這樣的應(yīng)用中看到月褥。
為了讓下載的音樂文件可以被其他應(yīng)用掃描到,我們需要調(diào)用Request對(duì)象的allowScaningByMediaScanner方法宁赤。
如果我們希望下載的文件可以被系統(tǒng)的Downloads應(yīng)用掃描到并管理,我們需要調(diào)用Request對(duì)象的setVisibleInDownloadsUi方法决左,傳遞參數(shù)true走贪。
取消和刪除下載
Download Manager的remove方法可以用來取消一個(gè)準(zhǔn)備進(jìn)行的下載,中止一個(gè)正在進(jìn)行的下載惑芭,或者刪除一個(gè)已經(jīng)完成的下載。
remove方法接受若干個(gè)download 的ID作為參數(shù)遂跟,你可以設(shè)置一個(gè)或者幾個(gè)你想要取消的下載的ID逃沿,如下代碼段所示:


```
downloadManager.remove(REFERENCE_1, REFERENCE_2, REFERENCE_3);  
```

>該方法返回成功取消的下載的個(gè)數(shù),如果一個(gè)下載被取消了幻锁,所有相關(guān)聯(lián)的文件凯亮,部分下載的文件和完全下載的文件都會(huì)被刪除。
查詢Download Manager
你可以通過查詢Download Manager來獲得下載任務(wù)的狀態(tài)哄尔,進(jìn)度假消,以及各種細(xì)節(jié),通過query方法返回一個(gè)包含了下載任務(wù)細(xì)節(jié)的Cursor岭接。
query方法傳遞一個(gè)DownloadManager.Query對(duì)象作為參數(shù)富拗,通過DownloadManager.Query對(duì)象的setFilterById方法可以篩選我們希望查詢的下
載任務(wù)的ID。也可以使用setFilterByStatus方法篩選我們希望查詢的某一種狀態(tài)的下載任務(wù)亿傅,傳遞的參數(shù)是DownloadManager.STATUS_*常量媒峡,可以指定
正在進(jìn)行瘟栖、暫停葵擎、失敗、完成四種狀態(tài)半哟。
Download Manager包含了一系列COLUMN_*靜態(tài)String常量酬滤,可以用來查詢Cursor中的結(jié)果列索引。我們可以查詢到下載任務(wù)的各種細(xì)節(jié)寓涨,包括狀態(tài)盯串,
文件大小,已經(jīng)下載的字節(jié)數(shù)戒良,標(biāo)題体捏,描述,URI糯崎,本地文件名和URI几缭,媒體類型以及Media Provider download URI。
下面的代碼段是通過注冊(cè)監(jiān)聽下載完成事件的廣播接受者來查詢下載完成文件的本地文件名和URI的實(shí)現(xiàn)方法:

```
@Override  
public void onReceive(Context context, Intent intent) {  
  long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);  
  if (myDownloadReference == reference) {  
       
    Query myDownloadQuery = new Query();  
    myDownloadQuery.setFilterById(reference);  
        
    Cursor myDownload = downloadManager.query(myDownloadQuery);  
    if (myDownload.moveToFirst()) {  
      int fileNameIdx =   
        myDownload.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);  
      int fileUriIdx =   
        myDownload.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);  
  
      String fileName = myDownload.getString(fileNameIdx);  
      String fileUri = myDownload.getString(fileUriIdx);  
      
      // TODO Do something with the file.  
      Log.d(TAG, fileName + " : " + fileUri);  
    }  
    myDownload.close();  
  
  }  
}  
```

>對(duì)于暫停和失敗的下載沃呢,我們可以通過查詢COLUMN_REASON列查詢出原因的整數(shù)碼年栓。
對(duì)于STATUS_PAUSED狀態(tài)的下載,可以通過DownloadManager.PAUSED_*靜態(tài)常量來翻譯出原因的整數(shù)碼薄霜,進(jìn)而判斷出下載是由于等待網(wǎng)絡(luò)連接
還是等待WiFi連接還是準(zhǔn)備重新下載三種原因而暫停某抓。
對(duì)于STATUS_FAILED狀態(tài)的下載纸兔,我們可以通過DownloadManager.ERROR_*來判斷失敗的原因片橡,可能是錯(cuò)誤碼(失敗原因)包括沒有存儲(chǔ)設(shè)備盆偿,
存儲(chǔ)空間不足,重復(fù)的文件名阵苇,或者HTTP errors负甸。
下面的代碼是如何查詢出當(dāng)前所有的暫停的下載任務(wù)呻待,提取出暫停的原因以及文件名稱队腐,下載標(biāo)題以及當(dāng)前進(jìn)度的實(shí)現(xiàn)方法:


```
// Obtain the Download Manager Service.  
String serviceString = Context.DOWNLOAD_SERVICE;  
DownloadManager downloadManager;  
downloadManager = (DownloadManager)getSystemService(serviceString);  
  
// Create a query for paused downloads.  
Query pausedDownloadQuery = new Query();  
pausedDownloadQuery.setFilterByStatus(DownloadManager.STATUS_PAUSED);  
  
// Query the Download Manager for paused downloads.  
Cursor pausedDownloads = downloadManager.query(pausedDownloadQuery);  
  
// Find the column indexes for the data we require.  
int reasonIdx = pausedDownloads.getColumnIndex(DownloadManager.COLUMN_REASON);  
int titleIdx = pausedDownloads.getColumnIndex(DownloadManager.COLUMN_TITLE);  
int fileSizeIdx =   
  pausedDownloads.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);      
int bytesDLIdx =   
  pausedDownloads.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);  
  
// Iterate over the result Cursor.  
while (pausedDownloads.moveToNext()) {  
  // Extract the data we require from the Cursor.  
  String title = pausedDownloads.getString(titleIdx);  
  int fileSize = pausedDownloads.getInt(fileSizeIdx);  
  int bytesDL = pausedDownloads.getInt(bytesDLIdx);  
  
  // Translate the pause reason to friendly text.  
  int reason = pausedDownloads.getInt(reasonIdx);  
  String reasonString = "Unknown";  
  switch (reason) {  
    case DownloadManager.PAUSED_QUEUED_FOR_WIFI :   
      reasonString = "Waiting for WiFi"; break;  
    case DownloadManager.PAUSED_WAITING_FOR_NETWORK :   
      reasonString = "Waiting for connectivity"; break;  
    case DownloadManager.PAUSED_WAITING_TO_RETRY :  
      reasonString = "Waiting to retry"; break;  
    default : break;  
  }  
  
  // Construct a status summary  
  StringBuilder sb = new StringBuilder();  
  sb.append(title).append("\n");  
  sb.append(reasonString).append("\n");  
  sb.append("Downloaded ").append(bytesDL).append(" / " ).append(fileSize);  
  
  // Display the status   
  Log.d("DOWNLOAD", sb.toString());  
}  
  
// Close the result Cursor.  
pausedDownloads.close();  
```
####參考
>[Android系統(tǒng)下載管理DownloadManager功能介紹及使用示例](http://www.trinea.cn/android/android-downloadmanager/)
[Android DownloadManager 的使用](http://blog.csdn.net/carrey1989/article/details/8060155)
[Android快速實(shí)現(xiàn)文件下載(只有4行代碼)](http://www.reibang.com/p/46fd1c253701)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迫淹,一起剝皮案震驚了整個(gè)濱河市敛熬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌应民,老刑警劉巖夕吻,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異归园,居然都是意外死亡稚矿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門桥爽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聚谁,“玉大人滞诺,你說我怎么就攤上這事环疼§帕ィ” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵伪阶,是天一觀的道長(zhǎng)栅贴。 經(jīng)常有香客問我熏迹,道長(zhǎng),這世上最難降的妖魔是什么坛缕? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任捆昏,我火速辦了婚禮,結(jié)果婚禮上宠页,老公的妹妹穿的比我還像新娘膨俐。我一直安慰自己罩句,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布乳愉。 她就那樣靜靜地躺著屯远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坡脐。 梳的紋絲不亂的頭發(fā)上房揭,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天晌端,我揣著相機(jī)與錄音咧纠,去河邊找鬼泻骤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛演痒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫡霞,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诊沪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼曾撤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渐裸,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤装悲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洞渤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體属瓣,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年护昧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惋耙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遥金,死狀恐怖蒜田,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冲粤,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布厢呵,位于F島的核電站傀顾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寒砖。R本人自食惡果不足惜嫉拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漠嵌。 院中可真熱鬧盖呼,春花似錦、人聲如沸几晤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)热芹。三九已至伊脓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間报腔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工纤房, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翻诉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓舒岸,卻偏偏與公主長(zhǎng)得像芦圾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子个少,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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