BroadcastReceiver

本文轉(zhuǎn)載自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html


1. Android廣播機(jī)制概述

Android廣播分為兩個(gè)方面:廣播發(fā)送者和廣播接收者,通常情況下拄丰,BroadcastReceiver指的就是廣播接收者(廣播接收器)府树。廣播作為Android組件間的通信方式,可以使用的場(chǎng)景如下:

  1. 同一app內(nèi)部的同一組件內(nèi)的消息通信(單個(gè)或多個(gè)線程之間)料按;

  2. 同一app內(nèi)部的不同組件之間的消息通信(單個(gè)進(jìn)程)奄侠;

  3. 同一app具有多個(gè)進(jìn)程的不同組件之間的消息通信;

  4. 不同app之間的組件之間消息通信站绪;

  5. Android系統(tǒng)在特定情況下與App之間的消息通信遭铺。

從實(shí)現(xiàn)原理看上,Android中的廣播使用了觀察者模式,基于消息的發(fā)布/訂閱事件模型魂挂。因此甫题,從實(shí)現(xiàn)的角度來(lái)看,Android中的廣播將廣播的發(fā)送者和接受者極大程度上解耦涂召,使得系統(tǒng)能夠方便集成坠非,更易擴(kuò)展。具體實(shí)現(xiàn)流程要點(diǎn)粗略概括如下:

  1. 廣播接收者BroadcastReceiver通過(guò)Binder機(jī)制向AMS(Activity Manager Service)進(jìn)行注冊(cè)果正;

  2. 廣播發(fā)送者通過(guò)binder機(jī)制向AMS發(fā)送廣播炎码;

  3. AMS查找符合相應(yīng)條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發(fā)送到BroadcastReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊(duì)列中秋泳;

  4. 消息循環(huán)執(zhí)行拿到此廣播潦闲,回調(diào)BroadcastReceiver中的onReceive()方法。

對(duì)于不同的廣播類型迫皱,以及不同的BroadcastReceiver注冊(cè)方式歉闰,具體實(shí)現(xiàn)上會(huì)有不同。但總體流程大致如上卓起。

由此看來(lái)和敬,廣播發(fā)送者和廣播接收者分別屬于觀察者模式中的消息發(fā)布和訂閱兩端,AMS屬于中間的處理中心戏阅。廣播發(fā)送者和廣播接收者的執(zhí)行是異步的昼弟,發(fā)出去的廣播不會(huì)關(guān)心有無(wú)接收者接收,也不確定接收者到底是何時(shí)才能接收到奕筐。顯然舱痘,整體流程與EventBus非常類似通孽。
在上文說(shuō)列舉的廣播機(jī)制具體可以使用的場(chǎng)景中录语,現(xiàn)分析實(shí)際應(yīng)用中的適用性

  • 第一種情形:同一app內(nèi)部的同一組件內(nèi)的消息通信(單個(gè)或多個(gè)線程之間),實(shí)際應(yīng)用中肯定是不會(huì)用到廣播機(jī)制的(雖然可以用)踪危,無(wú)論是使用擴(kuò)展變量作用域笆怠、基于接口的回調(diào)還是Handler-post/Handler-Message等方式,都可以直接處理此類問(wèn)題誊爹,若適用廣播機(jī)制蹬刷,顯然有些“殺雞牛刀”的感覺(jué),會(huì)顯太“重”频丘;

  • 第二種情形:同一app內(nèi)部的不同組件之間的消息通信(單個(gè)進(jìn)程)办成,對(duì)于此類需求,在有些教復(fù)雜的情況下單純的依靠基于接口的回調(diào)等方式不好處理搂漠,此時(shí)可以直接使用EventBus等迂卢,相對(duì)而言,EventBus由于是針對(duì)統(tǒng)一進(jìn)程,用于處理此類需求非常適合而克,且輕松解耦靶壮。可以參見(jiàn)文件《Android各組件/控件間通信利器之EventBus》员萍。

  • 第三腾降、四、五情形:由于涉及不同進(jìn)程間的消息通信碎绎,此時(shí)根據(jù)實(shí)際業(yè)務(wù)使用廣播機(jī)制會(huì)顯得非常適宜螃壤。下面主要針對(duì)Android廣播中的具體知識(shí)點(diǎn)進(jìn)行總結(jié)。

2. BroadcastReceiver

  • 自定義BroadcastReceiver
    自定義廣播接收器需要繼承基類BroadcastReceivre筋帖,并實(shí)現(xiàn)抽象方法onReceive(context, intent)方法奸晴。廣播接收器接收到相應(yīng)廣播后,會(huì)自動(dòng)回到onReceive(..)方法日麸。默認(rèn)情況下寄啼,廣播接收器也是運(yùn)行在UI線程,因此赘淮,onReceive方法中不能執(zhí)行太耗時(shí)的操作辕录。否則將因此ANR。一般情況下梢卸,根據(jù)實(shí)際業(yè)務(wù)需求走诞,onReceive方法中都會(huì)涉及到與其他組件之間的交互,如發(fā)送Notification蛤高、啟動(dòng)service等蚣旱。下面代碼片段是一個(gè)簡(jiǎn)單的廣播接收器的自定義:
public class MyBroadcastReceiver extends BroadcastReceiver {
    public static final String TAG = "MyBroadcastReceiver";
    public static int m = 1;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.w(TAG, "intent:" + intent);
        String name = intent.getStringExtra("name");
        Log.w(TAG, "name:" + name + " m=" + m);
        m++;
        
        Bundle bundle = intent.getExtras();
        
    }
}
  • BroadcastReceiver注冊(cè)類型

BroadcastReceiver總體上可以分為兩種注冊(cè)類型:靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)。

  • 靜態(tài)注冊(cè):直接在AndroidManifest.xml文件中進(jìn)行注冊(cè)戴陡。規(guī)則如下:
<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</receiver>

其中塞绿,需要注意的屬性
android:exported ——此broadcastReceiver能否接收其他App的發(fā)出的廣播,這個(gè)屬性默認(rèn)值有點(diǎn)意思恤批,其默認(rèn)值是由receiver中有無(wú)intent-filter決定的异吻,如果有intent-filter,默認(rèn)值為true喜庞,否則為false诀浪。(同樣的,activity/service中的此屬性默認(rèn)值一樣遵循此規(guī)則)同時(shí)延都,需要注意的是雷猪,這個(gè)值的設(shè)定是以application或者application user id為界的,而非進(jìn)程為界(一個(gè)應(yīng)用中可能含有多個(gè)進(jìn)程)晰房;
android:name —— 此broadcastReceiver類名求摇;
android:permission ——如果設(shè)置射沟,具有相應(yīng)權(quán)限的廣播發(fā)送方發(fā)送的廣播才能被此broadcastReceiver所接收
android:process ——broadcastReceiver運(yùn)行所處的進(jìn)程。默認(rèn)為app的進(jìn)程与境⊙楹唬可以指定獨(dú)立的進(jìn)程(Android四大基本組件都可以通過(guò)此屬性指定自己的獨(dú)立進(jìn)程)

常見(jiàn)的注冊(cè)形式有:

<receiver android:name=".MyBroadcastReceiver" >
   <intent-filter>
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
   <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
</receiver>

其中,intent-filter由于指定此廣播接收器將用于接收特定的廣播類型嚷辅。本示例中給出的是用于接收網(wǎng)絡(luò)狀態(tài)改變或開(kāi)啟啟動(dòng)時(shí)系統(tǒng)自身所發(fā)出的廣播簿姨。當(dāng)此App首次啟動(dòng)時(shí),系統(tǒng)會(huì)自動(dòng)實(shí)例化MyBroadcastReceiver簸搞,并注冊(cè)到系統(tǒng)中扁位。
之前常說(shuō):靜態(tài)注冊(cè)的廣播接收器即使app已經(jīng)退出,主要有相應(yīng)的廣播發(fā)出趁俊,依然可以接收到域仇,但此種描述自Android 3.1開(kāi)始有可能不再成立,具體分析詳見(jiàn)本文后面部分寺擂。

  • 動(dòng)態(tài)注冊(cè):動(dòng)態(tài)注冊(cè)時(shí)暇务,無(wú)須在AndroidManifest中注冊(cè)<receiver/>組件。直接在代碼中通過(guò)調(diào)用Context的registerReceiver函數(shù)怔软,可以在程序中動(dòng)態(tài)注冊(cè)BroadcastReceiver垦细。registerReceiver的定義形式如下:
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)

registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)

典型的寫(xiě)法示例如下:

public class MainActivity extends Activity {
    public static final String BROADCAST_ACTION = "com.example.corn";
    private BroadcastReceiver mBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BROADCAST_ACTION);
        registerReceiver(mBroadcastReceiver, intentFilter);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mBroadcastReceiver);
    }

}

注:Android中所有與觀察者模式有關(guān)的設(shè)計(jì)中,一旦涉及到register挡逼,必定在相應(yīng)的時(shí)機(jī)需要unregister括改。因此,上例在onDestroy()回到中需要unregisterReceiver(mBroadcastReceiver)家坎。
當(dāng)此Activity實(shí)例化時(shí)嘱能,會(huì)動(dòng)態(tài)將MyBroadcastReceiver注冊(cè)到系統(tǒng)中。當(dāng)此Activity銷毀時(shí)虱疏,動(dòng)態(tài)注冊(cè)的MyBroadcastReceiver將不再接收到相應(yīng)的廣播惹骂。

3. 廣播發(fā)送及廣播類型

經(jīng)常說(shuō)”發(fā)送廣播“和”接收“,表面上看廣播作為Android廣播機(jī)制中的實(shí)體做瞪,實(shí)際上這一實(shí)體本身是并不是以所謂的”廣播“對(duì)象存在的对粪,而是以”意圖“(Intent)去表示。定義廣播的定義過(guò)程装蓬,實(shí)際就是相應(yīng)廣播”意圖“的定義過(guò)程衩侥,然后通過(guò)廣播發(fā)送者將此”意圖“發(fā)送出去。被相應(yīng)的BroadcastReceiver接收后將會(huì)回調(diào)onReceive()函數(shù)矛物。
下段代碼片段顯示的是一個(gè)普通廣播的定義過(guò)程,并發(fā)送出去跪但。其中setAction(..)對(duì)應(yīng)于BroadcastReceiver中的intentFilter中的action履羞。

1 Intent intent = new Intent();
2 intent.setAction(BROADCAST_ACTION);
3 intent.putExtra("name", "qqyumidi");
4 sendBroadcast(intent);

根據(jù)廣播的發(fā)送方式峦萎,可以將其分為以下幾種類型:

  1. Normal Broadcast:普通廣播
  1. System Broadcast: 系統(tǒng)廣播
  2. Ordered broadcast:有序廣播
  3. Sticky Broadcast:粘性廣播(在 android 5.0/api 21中deprecated,不再推薦使用,相應(yīng)的還有粘性有序廣播忆首,同樣已經(jīng)deprecated)
  4. Local Broadcast:App應(yīng)用內(nèi)廣播

下面分別總結(jié)下各種類型的發(fā)送方式及其特點(diǎn)爱榔。

  1. Normal Broadcast:普通廣播
    此處將普通廣播界定為:開(kāi)發(fā)者自己定義的intent,以context.sendBroadcast_"AsUser"(intent, ...)形式糙及。具體可以使用的方法有:sendBroadcast(intent)/sendBroadcast(intent, receiverPermission)/sendBroadcastAsUser(intent, userHandler)/sendBroadcastAsUser(intent, userHandler,receiverPermission)详幽。普通廣播會(huì)被注冊(cè)了的相應(yīng)的感興趣(intent-filter匹配)接收,且順序是無(wú)序的浸锨。如果發(fā)送廣播時(shí)有相應(yīng)的權(quán)限要求唇聘,BroadCastReceiver如果想要接收此廣播,也需要有相應(yīng)的權(quán)限柱搜。

  2. System Broadcast: 系統(tǒng)廣播
    Android系統(tǒng)中內(nèi)置了多個(gè)系統(tǒng)廣播迟郎,只要涉及到手機(jī)的基本操作,基本上都會(huì)發(fā)出相應(yīng)的系統(tǒng)廣播聪蘸。如:開(kāi)啟啟動(dòng)宪肖,網(wǎng)絡(luò)狀態(tài)改變,拍照健爬,屏幕關(guān)閉與開(kāi)啟控乾,點(diǎn)亮不足等等。每個(gè)系統(tǒng)廣播都具有特定的intent-filter娜遵,其中主要包括具體的action蜕衡,系統(tǒng)廣播發(fā)出后,將被相應(yīng)的BroadcastReceiver接收魔熏。系統(tǒng)廣播在系統(tǒng)內(nèi)部當(dāng)特定事件發(fā)生時(shí)衷咽,有系統(tǒng)自動(dòng)發(fā)出。

  3. Ordered broadcast:有序廣播
    有序廣播的有序廣播中的“有序”是針對(duì)廣播接收者而言的蒜绽,指的是發(fā)送出去的廣播被BroadcastReceiver按照先后循序接收镶骗。有序廣播的定義過(guò)程與普通廣播無(wú)異,只是其的主要發(fā)送方式變?yōu)椋簊endOrderedBroadcast(intent, receiverPermission, ...)躲雅。

對(duì)于有序廣播鼎姊,其主要特點(diǎn)總結(jié)如下:

  • 多個(gè)具當(dāng)前已經(jīng)注冊(cè)且有效的BroadcastReceiver接收有序廣播時(shí),是按照先后順序接收的相赁,先后順序判定標(biāo)準(zhǔn)遵循為:將當(dāng)前系統(tǒng)中所有有效的動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)的BroadcastReceiver按照priority屬性值從大到小排序相寇,對(duì)于具有相同的priority的動(dòng)態(tài)廣播和靜態(tài)廣播,動(dòng)態(tài)廣播會(huì)排在前面钮科。

  • 先接收的BroadcastReceiver可以對(duì)此有序廣播進(jìn)行截?cái)嗷缴溃购竺娴腂roadcastReceiver不再接收到此廣播,也可以對(duì)廣播進(jìn)行修改绵脯,使后面的BroadcastReceiver接收到廣播后解析得到錯(cuò)誤的參數(shù)值佳励。當(dāng)然休里,一般情況下,不建議對(duì)有序廣播進(jìn)行此類操作赃承,尤其是針對(duì)系統(tǒng)中的有序廣播妙黍。

  1. Sticky Broadcast:粘性廣播(在 android 5.0/api 21中deprecated,不再推薦使用,相應(yīng)的還有粘性有序廣播瞧剖,同樣已經(jīng)deprecated)拭嫁。既然已經(jīng)deprecated,此處不再多做總結(jié)抓于。

  2. Local Broadcast:App應(yīng)用內(nèi)廣播(此處的App應(yīng)用以App應(yīng)用進(jìn)程為界)

由前文闡述可知做粤,Android中的廣播可以跨進(jìn)程甚至跨App直接通信,且注冊(cè)是exported對(duì)于有intent-filter的情況下默認(rèn)值是true毡咏,由此將可能出現(xiàn)安全隱患如下:

1.其他App可能會(huì)針對(duì)性的發(fā)出與當(dāng)前App intent-filter相匹配的廣播驮宴,由此導(dǎo)致當(dāng)前App不斷接收到廣播并處理;
2.其他App可以注冊(cè)與當(dāng)前App一致的intent-filter用于接收廣播呕缭,獲取廣播具體信息堵泽。

無(wú)論哪種情形,這些安全隱患都確實(shí)是存在的恢总。由此迎罗,最常見(jiàn)的增加安全性的方案是:

1.對(duì)于同一App內(nèi)部發(fā)送和接收廣播,將exported屬性人為設(shè)置成false片仿,使得非本App內(nèi)部發(fā)出的此廣播不被接收纹安;
2.在廣播發(fā)送和接收時(shí),都增加上相應(yīng)的permission砂豌,用于權(quán)限驗(yàn)證厢岂;
3.發(fā)送廣播時(shí),指定特定廣播接收器所在的包名阳距,具體是通過(guò)intent.setPackage(packageName)指定在塔粒,這樣此廣播將只會(huì)發(fā)送到此包中的App內(nèi)與之相匹配的有效廣播接收器中。

App應(yīng)用內(nèi)廣播可以理解成一種局部廣播的形式筐摘,廣播的發(fā)送者和接收者都同屬于一個(gè)App卒茬。實(shí)際的業(yè)務(wù)需求中,App應(yīng)用內(nèi)廣播確實(shí)可能需要用到咖熟。同時(shí)圃酵,之所以使用應(yīng)用內(nèi)廣播時(shí),而不是使用全局廣播的形式馍管,更多的考慮到的是Android廣播機(jī)制中的安全性問(wèn)題郭赐。
相比于全局廣播,App應(yīng)用內(nèi)廣播優(yōu)勢(shì)體現(xiàn)在:

1.安全性更高确沸;
2.更加高效捌锭。

為此躬存,Android v4兼容包中給出了封裝好的LocalBroadcastManager類,用于統(tǒng)一處理App應(yīng)用內(nèi)的廣播問(wèn)題舀锨,使用方式上與通常的全局廣播幾乎相同,只是注冊(cè)/取消注冊(cè)廣播接收器和發(fā)送廣播時(shí)將主調(diào)context變成了LocalBroadcastManager的單一實(shí)例宛逗。
代碼片段如下:

//registerReceiver(mBroadcastReceiver, intentFilter);
//注冊(cè)應(yīng)用內(nèi)廣播接收器
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
        
//unregisterReceiver(mBroadcastReceiver);
//取消注冊(cè)應(yīng)用內(nèi)廣播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.putExtra("name", "qqyumidi");
//sendBroadcast(intent);
//發(fā)送應(yīng)用內(nèi)廣播
localBroadcastManager.sendBroadcast(intent);

不同注冊(cè)方式的廣播接收器回調(diào)onReceive(context, intent)中的context具體類型

1.對(duì)于靜態(tài)注冊(cè)的ContextReceiver坎匿,回調(diào)onReceive(context, intent)中的context具體指的是ReceiverRestrictedContext;
2.對(duì)于全局廣播的動(dòng)態(tài)注冊(cè)的ContextReceiver雷激,回調(diào)onReceive(context, intent)中的context具體指的是Activity Context替蔬;
3.對(duì)于通過(guò)LocalBroadcastManager動(dòng)態(tài)注冊(cè)的ContextReceiver,回調(diào)onReceive(context, intent)中的context具體指的是Application Context屎暇。

注:對(duì)于LocalBroadcastManager方式發(fā)送的應(yīng)用內(nèi)廣播承桥,只能通過(guò)LocalBroadcastManager動(dòng)態(tài)注冊(cè)的ContextReceiver才有可能接收到(靜態(tài)注冊(cè)或其他方式動(dòng)態(tài)注冊(cè)的ContextReceiver是接收不到的)。

5.不同Android API版本中廣播機(jī)制相關(guān)API重要變遷

  1. Android5.0/API level 21開(kāi)始粘滯廣播和有序粘滯廣播過(guò)期根悼,以后不再建議使用凶异;

  2. ”靜態(tài)注冊(cè)的廣播接收器即使app已經(jīng)退出,主要有相應(yīng)的廣播發(fā)出挤巡,依然可以接收到剩彬,但此種描述自Android 3.1開(kāi)始有可能不再成立“。Android 3.1開(kāi)始系統(tǒng)在Intent與廣播相關(guān)的flag增加了參數(shù)矿卑,分別是FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES喉恋。

FLAG_INCLUDE_STOPPED_PACKAGES:包含已經(jīng)停止的包(停止:即包所在的進(jìn)程已經(jīng)退出)
FLAG_EXCLUDE_STOPPED_PACKAGES:不包含已經(jīng)停止的包

主要原因如下:

自Android3.1開(kāi)始,系統(tǒng)本身則增加了對(duì)所有app當(dāng)前是否處于運(yùn)行狀態(tài)的跟蹤母廷。在發(fā)送廣播時(shí)轻黑,不管是什么廣播類型,系統(tǒng)默認(rèn)直接增加了值為FLAG_EXCLUDE_STOPPED_PACKAGES的flag琴昆,導(dǎo)致即使是靜態(tài)注冊(cè)的廣播接收器氓鄙,對(duì)于其所在進(jìn)程已經(jīng)退出的app,同樣無(wú)法接收到廣播椎咧。
詳情參加Android官方文檔:http://developer.android.com/about/versions/android-3.1.html#launchcontrols

由此玖详,

  • 對(duì)于系統(tǒng)廣播,由于是系統(tǒng)內(nèi)部直接發(fā)出勤讽,無(wú)法更改此intent flag值蟋座,因此,3.1開(kāi)始對(duì)于靜態(tài)注冊(cè)的接收系統(tǒng)廣播的BroadcastReceiver脚牍,如果App進(jìn)程已經(jīng)退出向臀,將不能接收到廣播。

  • 但是對(duì)于自定義發(fā)送的廣播诸狭,可以通過(guò)復(fù)寫(xiě)此flag為FLAG_INCLUDE_STOPPED_PACKAGES券膀,使得靜態(tài)注冊(cè)的BroadcastReceiver君纫,即使所在App進(jìn)程已經(jīng)退出,也能能接收到廣播芹彬,并會(huì)啟動(dòng)應(yīng)用進(jìn)程蓄髓,但此時(shí)的BroadcastReceiver是重新新建的。

1 Intent intent = new Intent();
2 intent.setAction(BROADCAST_ACTION);
3 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
4 intent.putExtra("name", "qqyumidi");
5 sendBroadcast(intent);

注1:對(duì)于動(dòng)態(tài)注冊(cè)類型的BroadcastReceiver舒帮,由于此注冊(cè)和取消注冊(cè)實(shí)在其他組件(如Activity)中進(jìn)行会喝,因此,不受此改變影響玩郊。
注2:在3.1以前肢执,相信不少app可能通過(guò)靜態(tài)注冊(cè)方式監(jiān)聽(tīng)各種系統(tǒng)廣播,以此進(jìn)行一些業(yè)務(wù)上的處理(如即時(shí)app已經(jīng)退出译红,仍然能接收到预茄,可以啟動(dòng)service等..),3.1后,靜態(tài)注冊(cè)接受廣播方式的改變侦厚,將直接導(dǎo)致此類方案不再可行耻陕。于是,通過(guò)將Service與App本身設(shè)置成不同的進(jìn)程已經(jīng)成為實(shí)現(xiàn)此類需求的可行替代方案假夺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淮蜈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子已卷,更是在濱河造成了極大的恐慌梧田,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧蘸,死亡現(xiàn)場(chǎng)離奇詭異裁眯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)讳癌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門穿稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晌坤,你說(shuō)我怎么就攤上這事逢艘。” “怎么了骤菠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵它改,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我商乎,道長(zhǎng)央拖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鲜戒,結(jié)果婚禮上专控,老公的妹妹穿的比我還像新娘。我一直安慰自己遏餐,他們只是感情好伦腐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著失都,像睡著了一般蔗牡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗅剖,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音嘁扼,去河邊找鬼信粮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趁啸,可吹牛的內(nèi)容都是我干的强缘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼不傅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旅掂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起访娶,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤商虐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后崖疤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秘车,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年劫哼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叮趴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡权烧,死狀恐怖眯亦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情般码,我是刑警寧澤妻率,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站侈询,受9級(jí)特大地震影響舌涨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一囊嘉、第九天 我趴在偏房一處隱蔽的房頂上張望温技。 院中可真熱鬧,春花似錦扭粱、人聲如沸舵鳞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜓堕。三九已至,卻和暖如春博其,著一層夾襖步出監(jiān)牢的瞬間套才,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工慕淡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留背伴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓峰髓,卻偏偏與公主長(zhǎng)得像傻寂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子携兵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 現(xiàn)實(shí)中的廣播:電臺(tái)為了傳達(dá)一些消息而發(fā)送廣播疾掰,通過(guò)廣播攜帶要傳達(dá)的消息,群眾只要買一個(gè)收音機(jī)徐紧,就可以收到廣播了静檬。 ...
    stevewang閱讀 4,241評(píng)論 0 8
  • 從小到大巴柿,我都是屬于一個(gè)男孩子性格,每天和男生們廝混在一起死遭,在一個(gè)早戀很猖狂的時(shí)代广恢,我也會(huì)經(jīng)常問(wèn)我媽媽,為什么我...
    ma大玉兒閱讀 446評(píng)論 0 0
  • 如果老去的一天 提前來(lái)到 會(huì)怎么面對(duì)呢 老并不可怕 可怕的是心態(tài) 猶如內(nèi)心深處 種植的小樹(shù)苗 是枯枝黃椏 還是青蔥...
    Melshow閱讀 311評(píng)論 0 0
  • 央視九套節(jié)目《茶,一片樹(shù)葉的故事》是王沖霄執(zhí)導(dǎo)的探尋世界茶文化的紀(jì)錄片钠署。一共分為六個(gè)篇幅糠聪,分別從茶的種類、...
    帥梅香茗閱讀 1,068評(píng)論 2 2
  • 拉勾網(wǎng)Lagou “疲于奔命的生活最多能出產(chǎn)大量質(zhì)地一般的山寨貨,而在思維自由飛翔的時(shí)候可以拓展出難以想象的新世界...
    9f8c8b2539b5閱讀 1,638評(píng)論 0 3