第四章 Android 四大應(yīng)用組件

安卓的入門基礎(chǔ)就是四大應(yīng)用組件胜茧。分別是:Activity(活動(dòng)),Service(服務(wù)),Content Provider(內(nèi)容提供者),Broadcast Receiver(廣播接收者)。一般在面試或者筆試的過(guò)程中基括,這些都是最基本的問(wèn)題期犬。一個(gè)應(yīng)用里面會(huì)有很多個(gè)Activity河哑,這個(gè)不同的Activity 分別具備不同的功能,指引用戶進(jìn)行下一步的操作龟虎。

1.Activity

1.1 Activity的介紹

Activity 是用戶與屏幕進(jìn)行交互執(zhí)行電話璃谨,拍照,啟動(dòng)應(yīng)用等操作。簡(jiǎn)單來(lái)說(shuō)就是用戶在操作的過(guò)程中佳吞,看到的畫面拱雏。

1.2 Activity的跳轉(zhuǎn)和銷毀

每個(gè)Activity 都可以啟動(dòng)另一個(gè)Activity ,但是系統(tǒng)會(huì)自動(dòng)在你啟動(dòng)另一個(gè)Activity的時(shí)候底扳,將原有的Activity保存在棧中铸抑。棧遵循“先進(jìn)后出,后進(jìn)先出”的原則衷模。當(dāng)新的Activity啟動(dòng)的時(shí)候鹊汛,舊的Activity會(huì)的推送到棧上,獲取焦點(diǎn)阱冶。用戶點(diǎn)擊返回的時(shí)候刁憋,銷毀當(dāng)前的Activity,回到舊的Activity木蹬。還有一種情況至耻,就是當(dāng)你從A Activity跳轉(zhuǎn)B Activity 的時(shí)候,要求你返回的時(shí)候不能返回到 A Activity 镊叁,而是返回到 A Activity 的再上一個(gè)Activity尘颓。系統(tǒng)這時(shí)候會(huì)提供 finish()方法,結(jié)束當(dāng)前Activity意系。如圖所示泥耀。

情況一
情況二

1.3 Activity 的創(chuàng)建和生命周期

在創(chuàng)建Activity的時(shí)候,你就必須要了解Activity 的生命周期蛔添,了解一個(gè)Activity從創(chuàng)建痰催,到結(jié)束的過(guò)程。簡(jiǎn)記: CSRPSD(創(chuàng)始人盤絲洞)迎瞧,記不住自己打自己一巴掌

生命周期圖

1.4 Activity 的聲明

在上一節(jié)中夸溶,我們說(shuō)到 AndroidManifest.xml 文件中,我們會(huì)指定其中的某一個(gè)Activity為“ 主Activity” ,也就是啟動(dòng)該App的時(shí)候凶硅,程序的入口缝裁。

<activity android:name=".MainActivity">
?? <intent-filter>
?? ?? <action android:name="android.intent.action.MAIN" />
?? ?? <category android:name="android.intent.category.LAUNCHER" />
?? </intent-filter>

 </activity>

<activity>這個(gè)標(biāo)簽必須自<application>這個(gè)標(biāo)簽中。 <intent-filter>標(biāo)簽是過(guò)濾器足绅。<action>是聲明標(biāo)簽 android:name="android.intent.action.MAIN" 捷绑,這就聲明了 .MainActivity是主Activity,也就是程序的入口氢妈。<category>元素指定此 Activity 應(yīng)列入系統(tǒng)的應(yīng)用啟動(dòng)器內(nèi)(以便用戶啟動(dòng)該 Activity)粹污。
只有一個(gè)Activity 具備上述的操作和 "LAUNCHER"這個(gè)類別。否則會(huì)報(bào)錯(cuò)

1.5 Activity 的啟動(dòng)

假如是 MainActivity 跳轉(zhuǎn)到SingleActivity

1.5.1 顯式啟動(dòng)

方式一:
    Intent intent = new Intent(MainActivity.this, SingleActivity .class);
    startActivity(intent);

方式二:
   Component component = new Component(this,SingleActivity .class);
  Intent intent = new Intent();
  intent.setComponent(component);
  startActivity(intent);

方式三:
    Intent intent = new Intent();
  intent.setclass(this,SingleActivity .class);
  startActivity(intent);


1.5.2 隱式跳轉(zhuǎn)

1.5.2.1 隱式跳轉(zhuǎn)之Action跳轉(zhuǎn)

1.在 AndroidManifest.xml文件中注冊(cè)

<activity android:name=".SignInActivity";   
     <intent-filter  
         <action android:name="customer_action_here"  />
     </intent-filter>  
 </activity>  

2.在java代碼中調(diào)用

//創(chuàng)建一個(gè)隱式的 Intent 對(duì)象:Action 動(dòng)作 
    Intent intent = new Intent();
//設(shè)置 Intent 的動(dòng)作為清單中指定的action  
   intent.setAction("customer_action_here");
   startActivity(intent);

1.5.2.2 隱式跳轉(zhuǎn)之Category跳轉(zhuǎn)

1.在 AndroidManifest.xml文件中注冊(cè)

<activity android:name=".SignInActivity" >  
    <intent-filter>  
        <action android:name="customer_action_here" />  
        <category android:name="customer_category_here" />  
    </intent-filter>  
</activity>  

2.在java代碼中調(diào)用

//創(chuàng)建一個(gè)隱式的 Intent 對(duì)象:Category 類別  
Intent intent = new Intent();  
intent.setAction("customer_action_here");  
//添加與清單中相同的自定義category  
intent.addCategory("customer_category_here");  
startActivity(intent);  
1.5.2.3 隱式跳轉(zhuǎn)之Data跳轉(zhuǎn)

1.在 AndroidManifest.xml文件中注冊(cè)

< activity android:name=".SignInActivity">  
    < intent-filter>  
        < category android:name="android.intent.category.DEFAULT" />  
        < data  
            android:scheme="content"  
            android:host="com.example.intentdemo"  
            android:port="8080"  
            android:pathPattern=".*pdf"  
            android:mimeType="text/plain"/>  
    < /intent-filter>  
< /activity> 

2.在java代碼中調(diào)用

//創(chuàng)建一個(gè)隱式的 Intent 對(duì)象首量,方法四:Date 數(shù)據(jù)  
Intent intent = new Intent();  
Uri uri = Uri.parse("content://com.example.intentdemo:8080/abc.pdf");  
intent.setDataAndType(uri, "text/plain");  
startActivity(intent);  
1.5.2.4 拓展 隱式跳轉(zhuǎn)之瀏覽網(wǎng)頁(yè)
Uri  uri=new Uri ("www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent); 

1.5.2.5 拓展 隱式跳轉(zhuǎn)之調(diào)用地圖

//打開(kāi)地圖查看經(jīng)緯度  
Uri uri = Uri.parse("geo:38.899533,-77.036476");  
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent); 

1.5.2.6 拓展 隱式跳轉(zhuǎn)之調(diào)用電話撥號(hào)(不需要撥號(hào)權(quán)限)

Uri uri = Uri.parse("tel:10086");  
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);  

1.5.2.7 拓展 隱式跳轉(zhuǎn)之調(diào)用電話直接撥號(hào)(需要撥號(hào)權(quán)限)

Uri uri = Uri.parse("tel:15980665805");  
Intent intent = new Intent(Intent.ACTION_CALL, uri);//注意區(qū)別于上面的aciton  
startActivity(intent); 

1.5.2.8 拓展 隱式跳轉(zhuǎn)之調(diào)用短信程序

Intent intent = new Intent(Intent.ACTION_VIEW);      
intent.putExtra("sms_body", "這里寫短信內(nèi)容");      
intent.setType("vnd.android-dir/mms-sms");      
startActivity(intent);  

//指定了接受者
Uri uri = Uri.parse("smsto:10086");//指定接收者  
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);  
intent.putExtra("sms_body", "你這個(gè)黑心運(yùn)營(yíng)商");  
startActivity(intent);  

1.5.2.9 拓展 隱式跳轉(zhuǎn)之調(diào)用郵件程序

Intent intent = new Intent(Intent.ACTION_SENDTO);   
intent.setData(Uri.parse("mailto:xxx@gmail.com"));   
intent.putExtra(Intent.EXTRA_SUBJECT, "這是標(biāo)題");   
intent.putExtra(Intent.EXTRA_TEXT, "這是內(nèi)容");   
startActivity(intent);  

1.5.2.10 拓展 隱式跳轉(zhuǎn)之調(diào)用音樂(lè)播放器

Intent intent = new Intent(Intent.ACTION_VIEW);  
//Uri uri = Uri.parse("file:///sdcard/xiong_it.mp4");  
Uri uri = Uri.parse("file:///sdcard/xiong_it.mp3");  
intent.setDataAndType(uri, "audio/mp3");  
startActivity(intent);  

1.5.2.11 拓展 隱式跳轉(zhuǎn)之調(diào)用視頻播放器

Intent intent = new Intent(Intent.ACTION_VIEW);  
//Uri uri = Uri.parse("file:///sdcard/xiong_it.mp3");  
Uri uri = Uri.parse("file:///sdcard/xiong_it.mp4");  
intent.setDataAndType(uri, "video/mp4");  
startActivity(intent);  

1.5.2.12 拓展 隱式跳轉(zhuǎn)之調(diào)用視頻播放器

Intent intent = new Intent();   
intent.setAction(Intent.ACTION_WEB_SEARCH);   
intent.putExtra(SearchManager.QUERY, "android");   
startActivity(intent);  

2. Service 服務(wù)

2.1 Service 的介紹

Service 一個(gè)可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而不提供用戶界面的應(yīng)用組件壮吩。 Activity 是可以看見(jiàn)的而Service是不能看見(jiàn)的进苍。服務(wù)可由其他應(yīng)用組件啟動(dòng),而且即使用戶切換到其他應(yīng)用鸭叙,服務(wù)仍將在后臺(tái)繼續(xù)運(yùn)行觉啊。 此外,組件可以綁定到服務(wù)沈贝,以與之進(jìn)行交互杠人,甚至是執(zhí)行進(jìn)程間通信 (IPC)。 例如宋下,服務(wù)可以處理網(wǎng)絡(luò)事務(wù)搜吧、播放音樂(lè),執(zhí)行文件 I/O 或與內(nèi)容提供程序交互杨凑,而所有這一切均可在后臺(tái)進(jìn)行。

Service 不是單獨(dú)的運(yùn)行摆昧,默認(rèn)情況下是運(yùn)行在主程序中撩满。

Service 存在價(jià)值雖然不如Activity那么明顯,在執(zhí)行一些耗時(shí)的操作的時(shí)候需要用到Service 绅你,而主程序一般不執(zhí)行耗時(shí)操作伺帘,這樣會(huì)阻塞線程,所以必須重開(kāi)一個(gè)子線程忌锯,再將子線程用于執(zhí)行耗時(shí)操作伪嫁。Service充當(dāng)線程管理者的角色

2.2 Service的啟動(dòng)方式和生命周期

Service 的啟動(dòng)方式
1)、 Context.startService()
調(diào)用者與服務(wù)之間沒(méi)有關(guān)聯(lián)偶垮,即使調(diào)用者退出张咳,服務(wù)仍可運(yùn)行
2)、 Context.bindService()
調(diào)用者與服務(wù)綁定在一起似舵,調(diào)用者一旦退出脚猾,服務(wù)也就終止

生命周期

2.3 Started Service總結(jié):

1.Activity頁(yè)面中需要startService(intent) 和 stopService(intent)兩個(gè)方法來(lái)啟動(dòng)Service和停止Service;

  1. 繼承于Service類的自定義子類——MyStartService類中,生命周期回調(diào)方法有:onCreate() 砚哗、onStartCommand() 龙助、onDestroy();
  2. 如果停止服務(wù)蛛芥,可以在Activity中調(diào)用stopService(intent)提鸟,也可以intent到Service中執(zhí)行stopSelf()方法;

4.執(zhí)行停止服務(wù)方法仅淑,會(huì)回調(diào)Service生命周期中的onDestroy()方法称勋;
5.如果希望關(guān)閉Activity窗體,服務(wù)也停止漓糙,那么在Activity的onDestroy()方法中執(zhí)行stopService()方法铣缠。如果希望關(guān)閉窗體后,服務(wù)還繼續(xù),那么Activity的onDestroy()中不執(zhí)行停止服務(wù)即可蝗蛙;
6.在StartService中不會(huì)回調(diào)onBind()方法懒熙;

  1. 在停止服務(wù)后询刹,如果再次點(diǎn)擊“播放”,可以重新啟動(dòng)StartService。

在實(shí)際使用的時(shí)候最后自定義一個(gè)類繼承service.

3.Content Provider

我覺(jué)得將Content Provide 叫做內(nèi)容提供者挺合適的糙俗。談Content Provide的時(shí)候就必須套說(shuō)說(shuō)數(shù)據(jù)庫(kù)了。數(shù)據(jù)庫(kù)在Android 是私有的裕膀,這樣你就不能隨便拿我的數(shù)據(jù)了辑鲤。數(shù)據(jù)的安全性就得到了保障,但是當(dāng)你需要將自己數(shù)據(jù)庫(kù)的數(shù)據(jù)提供給別的應(yīng)用程序的時(shí)候喷屋,你該怎么辦呢琳拨?這時(shí)候就需要Content Provider來(lái)實(shí)現(xiàn)了。其他的應(yīng)用程序需要使用數(shù)據(jù)的時(shí)候屯曹,可以通過(guò)Content Resolve來(lái)操作Content Provider暴露出來(lái)的數(shù)據(jù)狱庇。
?? 一旦某個(gè)應(yīng)用程序通過(guò)Content Provider暴露了自己的數(shù)據(jù)操作接口,那么不管該應(yīng)用程序是否啟動(dòng)恶耽,其他應(yīng)用程序都可以通過(guò)該接口來(lái)操作被暴露的內(nèi)部數(shù)據(jù)密任,包括增加數(shù)據(jù)、刪除數(shù)據(jù)偷俭、修改數(shù)據(jù)浪讳、查詢數(shù)據(jù)等。
??雖然大部分使用Content Provider操作的數(shù)據(jù)都來(lái)自于數(shù)據(jù)庫(kù)涌萤,但是也可以來(lái)自于文件淹遵、SharedPreferences、XML或網(wǎng)絡(luò)等其他存儲(chǔ)方式形葬。

3.1 Content Provider的核心類

1合呐、Content Provider:(A應(yīng)用暴露數(shù)據(jù))
● 一個(gè)程序可以通過(guò)實(shí)現(xiàn)一個(gè)Content Provider的抽象接口將自己的數(shù)據(jù)暴露出去;
● 外界根本看不到笙以,也不用看到這個(gè)應(yīng)用暴露的數(shù)據(jù)在應(yīng)用當(dāng)中是如何存儲(chǔ)的淌实,是用數(shù)據(jù)庫(kù)存儲(chǔ)還是用文件存儲(chǔ),還是通過(guò)網(wǎng)上獲得猖腕,這些一切都不重要拆祈,重要的是外界可以通過(guò)這一套標(biāo)準(zhǔn)及統(tǒng)一的接口和程序里的數(shù)據(jù)打交道,可以讀取程序的數(shù)據(jù)倘感,也可以修改程序的數(shù)據(jù)放坏。
2、Content Resolver:(操作A應(yīng)用所暴露的數(shù)據(jù))
● 外界的程序通過(guò)ContentResolver接口可以訪問(wèn)ContentProvider提供的數(shù)據(jù)老玛;
● ContentResolver 可以理解成是HttpClient的作用淤年。
3钧敞、 Uri:Uri是ContentResolver和ContentProvider進(jìn)行數(shù)據(jù)交換的標(biāo)識(shí)。
● 每個(gè)ContentProvider提供公共的URI來(lái)唯一標(biāo)識(shí)其數(shù)據(jù)集麸粮。管理多個(gè)數(shù)據(jù)集的(多個(gè)表)的 ContentProvider 為每個(gè)數(shù)據(jù)集提供了單獨(dú)的URI溉苛。
● Uri 的標(biāo)準(zhǔn)前綴:以“content://”作為前綴,這個(gè)是標(biāo)準(zhǔn)的前綴弄诲,表示該數(shù)據(jù)由 ContentProvider 管理愚战。
● Uri 的authority部分:該部分是完整的類名。(使用小寫形式)齐遵。
● Uri 的path部分(資源部分寂玲、數(shù)據(jù)部分): 用于決定哪類數(shù)據(jù)被請(qǐng)求。
● 被請(qǐng)求的特定記錄的id值梗摇。如果請(qǐng)求不僅限于某個(gè)單條數(shù)據(jù)拓哟,該部分及其前面的斜線應(yīng)該刪除。
● 為了將一個(gè)字符串轉(zhuǎn)換成Uri伶授,Android中提供了Uri的parse()靜態(tài)方法來(lái)實(shí)現(xiàn)彰檬。
【備注:】URI、URL谎砾、URN的區(qū)別:
● 首先,URI捧颅,是uniform resource identifier景图,統(tǒng)一資源標(biāo)識(shí)符,用來(lái)唯一的標(biāo)識(shí)一個(gè)資源碉哑。
● URL是uniform resource locator挚币,統(tǒng)一資源定位器,它是一種具體的URI扣典,即URL可以用來(lái)標(biāo)識(shí)一個(gè)資源妆毕,而且還指明了如何locate這個(gè)資源。
● URN贮尖,uniform resource name笛粘,統(tǒng)一資源命名,是通過(guò)名字來(lái)標(biāo)識(shí)資源湿硝,比如mailto:java-net@java.sun.com薪前。
也就是說(shuō),URI是以一種抽象的关斜,高層次概念定義統(tǒng)一資源標(biāo)識(shí)示括,而URL和URN則是具體的資源標(biāo)識(shí)的方式。URL和URN都是一種URI痢畜。
總結(jié)一下:URL是一種具體的URI垛膝,它不僅唯一標(biāo)識(shí)資源鳍侣,而且還提供了定位該資源的信息。URI是一種語(yǔ)義上的抽象概念吼拥,可以是絕對(duì)的倚聚,也可以是相對(duì)的,而URL則必須提供足夠的信息來(lái)定位扔罪,所以秉沼,是絕對(duì)的。

3.2 使用ContentResolver 操作數(shù)據(jù)的步驟:

1矿酵、調(diào)用Context的getContentResolver()方法獲得ContentResolver 對(duì)象唬复;
2、調(diào)用使用ContentResolver 的insert()全肮、delete()敞咧、update()、query()方法操作數(shù)據(jù)辜腺。
● Uri insert(Uri uri, ContentValues values)
● int delete(Uri uri, String where, String[] whereArgs)
● int update(Uri uri, ContentValues values, String where, String[] whereArgs)
● Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder)
參數(shù)解釋:
String where:表示帶有占位符的where子句組成的字符串休建;
String[] whereArgs:表示替換where參數(shù)中占位符后的數(shù)據(jù)組成的字符串?dāng)?shù)組;
String sortOrder:表示select語(yǔ)句中的order by子句組成的字符串评疗;
String[] projection:表示select語(yǔ)句中需要查詢的所有的字段組成的字符串?dāng)?shù)組测砂。
ContentValues values:是由數(shù)據(jù)庫(kù)中表字段和往該字段中放置的數(shù)據(jù)所組成的鍵值對(duì)對(duì)象。
【備注:】以上四個(gè)方法的參數(shù)分別是2百匆、3砌些、4、5個(gè)加匈。

4.Broadcast 廣播 或者 Broadcast Receiver 廣播接收器

廣播接收器存璃,也被稱為全局事件,或系統(tǒng)事件雕拼。
??當(dāng)Android系統(tǒng)中任何程序有動(dòng)作時(shí)纵东,如果想通知其他程序,采用廣播的方式進(jìn)行傳播是非常有效的啥寇。廣播從理論上說(shuō)偎球,可以將一個(gè)動(dòng)作傳播給任意多個(gè)程序(當(dāng)然,廣播接收器的數(shù)量會(huì)收到系統(tǒng)限制)辑甜。
??在Android中甜橱,有一些操作完成以后,會(huì)發(fā)送廣播栈戳,比如說(shuō)發(fā)出一條短信岂傲,或打出一個(gè)電話,如果某個(gè)程序接收了這個(gè)廣播子檀,就會(huì)做相應(yīng)的處理镊掖。這個(gè)廣播跟我們傳統(tǒng)意義中的電臺(tái)廣播有些相似之處乃戈。之所以叫做廣播,就是因?yàn)樗回?fù)責(zé)“說(shuō)”而不管你“聽(tīng)不聽(tīng)”亩进,也就是不管你接收方如何處理症虑。另外,廣播可以被不只一個(gè)應(yīng)用程序所接收归薛,當(dāng)然也可能不被任何應(yīng)用程序所接收谍憔。
??廣播機(jī)制最大的特點(diǎn)就是發(fā)送方并不關(guān)心接收方是否接到數(shù)據(jù),也不關(guān)心接收方是如何處理數(shù)據(jù)的主籍。
??Android中廣播的是操作系統(tǒng)中產(chǎn)生的各種各樣的事件习贫。例如,收到一條短信就會(huì)產(chǎn)生一個(gè)收到短信息的事件千元。而Android操作系統(tǒng)一旦內(nèi)部產(chǎn)生了這些事件苫昌,就會(huì)向所有的廣播接收器對(duì)象來(lái)廣播這些事件。

4.1 廣播機(jī)制的三要素

Android廣播機(jī)制包含三個(gè)基本要素:
1幸海、廣播(Broadcast) - 用于發(fā)送廣播祟身;
2、廣播接收器(Broadcast Receiver) - 用于接收廣播物独;
3袜硫、意圖內(nèi)容(Intent)-用于保存廣播相關(guān)信息的媒介。
Broadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制挡篓。而B(niǎo)roadcast Receiver是對(duì)發(fā)送出來(lái)的Broadcast進(jìn)行過(guò)濾接受并響應(yīng)的一類組件父款。

4.2 廣播的生命周期:

1、廣播接收器僅在它執(zhí)行這個(gè)方法時(shí)處于活躍狀態(tài)瞻凤。當(dāng)onReceive()返回后,它即為失活狀態(tài)世杀。
2阀参、擁有一個(gè)活躍狀態(tài)的廣播接收器的進(jìn)程被保護(hù)起來(lái)而不會(huì)被殺死,但僅擁有失活狀態(tài)組件的進(jìn)程則會(huì)在其它進(jìn)程需要它所占有的內(nèi)存的時(shí)候隨時(shí)被殺掉瞻坝。
3蛛壳、如果響應(yīng)一個(gè)廣播信息需要很長(zhǎng)的一段時(shí)間,一般會(huì)將其納入一個(gè)衍生的線程中去完成所刀,而不是在主線程內(nèi)完成它衙荐,從而保證用戶交互過(guò)程的流暢。廣播接收程序的時(shí)間限制為10秒浮创。

4.3 注冊(cè)Broadcast Receiver的方法

Broadcast Receiver用于監(jiān)聽(tīng)被廣播的事件(Intent)忧吟,為了達(dá)到這個(gè)目的,Broadcast Receiver必須進(jìn)行注冊(cè)斩披,注冊(cè)的方法有以下兩種:
1溜族、靜態(tài)注冊(cè):
靜態(tài)注冊(cè)方式是在AndroidManifest.xml的application里面定義receiver并設(shè)置要接收的action讹俊。
如果在清單配置文件中配置了廣播接收器,那么程序在安裝后會(huì)自動(dòng)注冊(cè)廣播接收器煌抒。
靜態(tài)注冊(cè)方式的特點(diǎn):不管該應(yīng)用程序是否處于活動(dòng)狀態(tài)仍劈,都會(huì)進(jìn)行監(jiān)聽(tīng)。

<receiver 
    android:name=".CallReceiver"
    android:enabled="true">
    <intent-filter >
        <action android:name="android.intent.action.PHONE_STATE"/>
    </intent-filter>
</receiver>

其中MyReceiver為繼承Broadcast Receiver的類寡壮,重寫了onReceiver方法贩疙,并在onReceiver方法中對(duì)廣播進(jìn)行處理。<intent-filter>標(biāo)簽設(shè)置過(guò)濾器况既,接收指定action廣播这溅。

2、動(dòng)態(tài)注冊(cè):
動(dòng)態(tài)注冊(cè)方式是在activity里面調(diào)用當(dāng)前上下文對(duì)象的registerReceiver() 方法 來(lái)注冊(cè)坏挠,和靜態(tài)的內(nèi)容差不多芍躏。一個(gè)形參是receiver對(duì)象,另一個(gè)是IntentFilter對(duì)象降狠。而IntentFilter構(gòu)造方法的參數(shù)是要接收的action对竣。
動(dòng)態(tài)注冊(cè)方式特點(diǎn):在代碼中進(jìn)行注冊(cè)后,當(dāng)應(yīng)用程序關(guān)閉后榜配,就不再進(jìn)行監(jiān)聽(tīng)否纬。

MyReceiver receiver = new MyReceiver();
//創(chuàng)建過(guò)濾器,并指定action蛋褥,使之用于接收同action的廣播
IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");
//注冊(cè)廣播接收器
registerReceiver(receiver, filter);

4.4 發(fā)送廣播

// 指定廣播目標(biāo)Action
Intent intent = new Intent("MyReceiver_Action");
// 可通過(guò)Intent攜帶消息
intent.putExtra("msg", "發(fā)送廣播");
// 發(fā)送廣播消息
sendBroadcast(intent);

4.5临燃、注銷BroadcastReceiver:

1、一般在onStart中注冊(cè)BroadcastReceiver烙心,在onStop中取消BroadcastReceiver膜廊。
2、一個(gè)BroadcastReceiver 對(duì)象只有在被調(diào)用onReceive(Context, Intent)時(shí)才有效淫茵,當(dāng)從該函數(shù)返回后爪瓜,該對(duì)象就無(wú)效的了,結(jié)束生命周期匙瘪。

//注銷廣播接收器
unregisterReceiver(receiver);

4.6 代碼中的使用

4.6.1 攔截短信

  <receiver
            android:name=".MySmsReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter android:priority="1" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" >
                </action>
            </intent-filter>
        </receiver>
//Protocol Data Unit  (PDU:協(xié)議數(shù)據(jù)單元)
public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "==來(lái)短信了");
        // 獲取短信的具體信息:短信發(fā)送號(hào)碼铆铆,短信內(nèi)容,短信發(fā)送時(shí)間
        Bundle bundle = intent.getExtras();
        Object[] pdus = (Object[]) bundle.get("pdus");
        SmsMessage[] smsMessage = new SmsMessage[pdus.length];
        for (int i = 0; i < pdus.length; i++) {
            smsMessage[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        }
        String phoneNumber = smsMessage[0].getDisplayOriginatingAddress();
        StringBuilder sb = new StringBuilder();
        for (SmsMessage sms : smsMessage) {
            sb.append(sms.getDisplayMessageBody());
        }
        String content = sb.toString();
        Log.i(TAG, "==來(lái)短信了" + phoneNumber + ":" + content);
                abortBroadcast();

    }

4.6.2 丹喻、來(lái)去電監(jiān)聽(tīng):

public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "==電話狀態(tài)改變了");
        TelephonyManager manager = (TelephonyManager) context
                .getSystemService(Service.TELEPHONY_SERVICE);
        Bundle bundle = intent.getExtras();
        // String phoneNumber0 = bundle
        // .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
        phoneNumber = bundle.getString("incoming_number");
        prefs = context.getSharedPreferences("phonenumber",
                Context.MODE_PRIVATE);
        if (phoneNumber != null) {
            editor = prefs.edit();
            editor.putString("phoneNumber", phoneNumber);
            editor.commit();
        } else {
            phoneNumber = prefs.getString("phoneNumber", "");
        }
        int state = manager.getCallState();
        switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:// 鈴聲響動(dòng)
            Log.i(TAG, "==鈴聲響了" + phoneNumber);
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:// 電話接聽(tīng)
            Log.i(TAG, "==接聽(tīng)電話" + phoneNumber);
            break;
        case TelephonyManager.CALL_STATE_IDLE:// 掛電話了
            Log.i(TAG, "==電話掛了" + phoneNumber);
            break;
        default:
            break;
        }
    }
<receiver
            android:name=".MyPhoneReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" >
                </action>
            </intent-filter>
        </receiver>

4.6.3 截獲屏幕休眠與喚醒

public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
            Log.i(TAG, "==屏幕休眠了");
        }
        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
            Log.i(TAG, "==屏幕喚醒了");
        }
    }

【注冊(cè):】
ScreenOffOnReceiver myReceiver = new ScreenOffOnReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(myReceiver, filter);
【備注:】屏幕喚醒和休眠廣播只能在代碼中注冊(cè)薄货,如果在清單配置文件中注冊(cè)將不起作用。

4.6.4 開(kāi)機(jī)自動(dòng)運(yùn)行

    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "監(jiān)聽(tīng)到開(kāi)機(jī)了", Toast.LENGTH_LONG).show();
        Intent intent2 = new Intent(context, MainActivity.class);
        context.startActivity(intent2);
    }

        <receiver
            android:name=".LaunchReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

4.6.5 手機(jī)電池當(dāng)前電量

public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "電量降低 ", Toast.LENGTH_LONG).show();
    }
        <receiver
            android:name=".BatteryReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW" >
                </action>
            </intent-filter>
        </receiver>

參考:【Android系統(tǒng)廣播大全】

  1. String ADD_SHORTCUT_ACTION 動(dòng)作:在系統(tǒng)中添加一個(gè)快捷方式碍论。
  2. String ALL_APPS_ACTION 動(dòng)作:列舉所有可用的應(yīng)用谅猾。輸入:無(wú)。
  3. String ALTERNATIVE_CATEGORY 類別:說(shuō)明 activity 是用戶正在瀏覽的數(shù)據(jù)的一個(gè)可選操作鳍悠。
  4. String ANSWER_ACTION 動(dòng)作:處理?yè)苋氲碾娫挕?/li>
  5. String BATTERY_CHANGED_ACTION 廣播:充電狀態(tài)赊瞬,或者電池的電量發(fā)生變化先煎。
  6. String BOOT_COMPLETED_ACTION 廣播:在系統(tǒng)啟動(dòng)后,這個(gè)動(dòng)作被廣播一次(只有一次)巧涧。
  7. String BROWSABLE_CATEGORY 類別:能夠被瀏覽器安全使用的 activities 必須支持這個(gè)類別薯蝎。
  8. String BUG_REPORT_ACTION 動(dòng)作:顯示 activity 報(bào)告錯(cuò)誤。
  9. String CALL_ACTION 動(dòng)作:撥打電話谤绳,被呼叫的聯(lián)系人在數(shù)據(jù)中指定占锯。
  10. String CALL_FORWARDING_STATE_CHANGED_ACTION 廣播:語(yǔ)音電話的呼叫轉(zhuǎn)移狀態(tài)已經(jīng)改變。
  11. String CLEAR_CREDENTIALS_ACTION 動(dòng)作:清除登陸憑證 (credential)缩筛。
  12. String CONFIGURATION_CHANGED_ACTION 廣播:設(shè)備的配置信息已經(jīng)改變消略,參見(jiàn) Resources.Configuration.
  13. Creator CREATOR 無(wú) 無(wú)
  14. String DATA_ACTIVITY_STATE_CHANGED_ACTION 廣播:電話的數(shù)據(jù)活動(dòng)(data activity)狀態(tài)(即收發(fā)數(shù)據(jù)的狀態(tài))已經(jīng)改變。
  15. String DATA_CONNECTION_STATE_CHANGED_ACTION 廣播:電話的數(shù)據(jù)連接狀態(tài)已經(jīng)改變瞎抛。
  16. String DATE_CHANGED_ACTION 廣播:日期被改變艺演。
  17. String DEFAULT_ACTION 動(dòng)作:和 VIEW_ACTION 相同,是在數(shù)據(jù)上執(zhí)行的標(biāo)準(zhǔn)動(dòng)作桐臊。
  18. String DEFAULT_CATEGORY 類別:如果 activity 是對(duì)數(shù)據(jù)執(zhí)行確省動(dòng)作(點(diǎn)擊, center press)的一個(gè)選項(xiàng)胎撤,需要設(shè)置這個(gè)類別。
  19. String DELETE_ACTION 動(dòng)作:從容器中刪除給定的數(shù)據(jù)断凶。
  20. String DEVELOPMENT_PREFERENCE_CATEGORY 類別:說(shuō)明 activity 是一個(gè)設(shè)置面板 (development preference panel).
  21. String DIAL_ACTION 動(dòng)作:撥打數(shù)據(jù)中指定的電話號(hào)碼伤提。
  22. String EDIT_ACTION 動(dòng)作:為制定的數(shù)據(jù)顯示可編輯界面。
  23. String EMBED_CATEGORY 類別:能夠在上級(jí)(父)activity 中運(yùn)行认烁。
  24. String EMERGENCY_DIAL_ACTION 動(dòng)作:撥打緊急電話號(hào)碼肿男。
  25. int FORWARD_RESULT_LAUNCH 啟動(dòng)標(biāo)記:如果這個(gè)標(biāo)記被設(shè)置,而且被一個(gè)已經(jīng)存在的 activity 用來(lái)啟動(dòng)新的 activity却嗡,已有 activity 的回復(fù)目標(biāo) (reply target) 會(huì)被轉(zhuǎn)移給新的 activity舶沛。
  26. String FOTA_CANCEL_ACTION 廣播:取消所有被掛起的 (pending) 更新下載。
  27. String FOTA_INSTALL_ACTION 廣播:更新已經(jīng)被確認(rèn)窗价,馬上就要開(kāi)始安裝如庭。
  28. String FOTA_READY_ACTION 廣播:更新已經(jīng)被下載,可以開(kāi)始安裝舌镶。
  29. String FOTA_RESTART_ACTION 廣播:恢復(fù)已經(jīng)停止的更新下載。
  30. String FOTA_UPDATE_ACTION 廣播:通過(guò) OTA 下載并安裝操作系統(tǒng)更新豪娜。
  31. String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 類別:To be used as code under test for framework instrumentation tests.
  32. String GADGET_CATEGORY 類別:這個(gè) activity 可以被嵌入宿主 activity (activity that is hosting gadgets)餐胀。
  33. String GET_CONTENT_ACTION 動(dòng)作:讓用戶選擇數(shù)據(jù)并返回。
  34. String HOME_CATEGORY 類別:主屏幕 (activity)瘤载,設(shè)備啟動(dòng)后顯示的第一個(gè) activity否灾。
  35. String INSERT_ACTION 動(dòng)作:在容器中插入一個(gè)空項(xiàng) (item)。
  36. String INTENT_EXTRA 附加數(shù)據(jù):和 PICK_ACTIVITY_ACTION 一起使用時(shí)鸣奔,說(shuō)明用戶選擇的用來(lái)顯示的 activity墨技;和 ADD_SHORTCUT_ACTION 一起使用的時(shí)候惩阶,描述要添加的快捷方式。
  37. String LABEL_EXTRA 附加數(shù)據(jù):大寫字母開(kāi)頭的字符標(biāo)簽扣汪,和 ADD_SHORTCUT_ACTION 一起使用断楷。
  38. String LAUNCHER_CATEGORY 類別:Activity 應(yīng)該被顯示在頂級(jí)的 launcher 中。
  39. String LOGIN_ACTION 動(dòng)作:獲取登錄憑證崭别。
  40. String MAIN_ACTION 動(dòng)作:作為主入口點(diǎn)啟動(dòng)冬筒,不需要數(shù)據(jù)。
  41. String MEDIABUTTON_ACTION 廣播:用戶按下了“Media Button”茅主。
  42. String MEDIA_BAD_REMOVAL_ACTION 廣播:擴(kuò)展介質(zhì)(擴(kuò)展卡)已經(jīng)從 SD 卡插槽拔出舞痰,但是掛載點(diǎn) (mount point) 還沒(méi)解除 (unmount)。
  43. String MEDIA_EJECT_ACTION 廣播:用戶想要移除擴(kuò)展介質(zhì)(拔掉擴(kuò)展卡)诀姚。
  44. String MEDIA_MOUNTED_ACTION 廣播:擴(kuò)展介質(zhì)被插入响牛,而且已經(jīng)被掛載。
  45. String MEDIA_REMOVED_ACTION 廣播:擴(kuò)展介質(zhì)被移除赫段。
  46. String MEDIA_SCANNER_FINISHED_ACTION 廣播:已經(jīng)掃描完介質(zhì)的一個(gè)目錄呀打。
  47. String MEDIA_SCANNER_STARTED_ACTION 廣播:開(kāi)始掃描介質(zhì)的一個(gè)目錄。
  48. String MEDIA_SHARED_ACTION 廣播:擴(kuò)展介質(zhì)的掛載被解除 (unmount)瑞佩,因?yàn)樗呀?jīng)作為 USB 大容量存儲(chǔ)被共享聚磺。
  49. String MEDIA_UNMOUNTED_ACTION 廣播:擴(kuò)展介質(zhì)存在,但是還沒(méi)有被掛載 (mount)炬丸。
  50. String MESSAGE_WAITING_STATE_CHANGED_ACTION 廣播:電話的消息等待(語(yǔ)音郵件)狀態(tài)已經(jīng)改變瘫寝。
  51. int MULTIPLE_TASK_LAUNCH 啟動(dòng)標(biāo)記:和 NEW_TASK_LAUNCH 聯(lián)合使用,禁止將已有的任務(wù)改變?yōu)榍熬叭蝿?wù) (foreground)稠炬。
  52. String NETWORK_TICKLE_RECEIVED_ACTION 廣播:設(shè)備收到了新的網(wǎng)絡(luò) "tickle" 通知焕阿。
  53. int NEW_TASK_LAUNCH 啟動(dòng)標(biāo)記:設(shè)置以后,activity 將成為歷史堆棧中的第一個(gè)新任務(wù)(棧頂)首启。
  54. int NO_HISTORY_LAUNCH 啟動(dòng)標(biāo)記:設(shè)置以后暮屡,新的 activity 不會(huì)被保存在歷史堆棧中。
  55. String PACKAGE_ADDED_ACTION 廣播:設(shè)備上新安裝了一個(gè)應(yīng)用程序包毅桃。
  56. String PACKAGE_REMOVED_ACTION 廣播:設(shè)備上刪除了一個(gè)應(yīng)用程序包褒纲。
  57. String PHONE_STATE_CHANGED_ACTION 廣播:電話狀態(tài)已經(jīng)改變。
  58. String PICK_ACTION 動(dòng)作:從數(shù)據(jù)中選擇一個(gè)項(xiàng)目 (item)钥飞,將被選中的項(xiàng)目返回莺掠。
  59. String PICK_ACTIVITY_ACTION 動(dòng)作:選擇一個(gè) activity,返回被選擇的 activity 的類(名)读宙。
  60. String PREFERENCE_CATEGORY 類別:activity是一個(gè)設(shè)置面板 (preference panel)彻秆。
  61. String PROVIDER_CHANGED_ACTION 廣播:更新將要(真正)被安裝。
  62. String PROVISIONING_CHECK_ACTION 廣播:要求 polling of provisioning service 下載最新的設(shè)置。
  63. String RUN_ACTION 動(dòng)作:運(yùn)行數(shù)據(jù)(指定的應(yīng)用)唇兑,無(wú)論它(應(yīng)用)是什么酒朵。
  64. String SAMPLE_CODE_CATEGORY 類別:To be used as an sample code example (not part of the normal user experience).
  65. String SCREEN_OFF_ACTION 廣播:屏幕被關(guān)閉。
  66. String SCREEN_ON_ACTION 廣播:屏幕已經(jīng)被打開(kāi)扎附。
  67. String SELECTED_ALTERNATIVE_CATEGORY 類別:對(duì)于被用戶選中的數(shù)據(jù)蔫耽,activity 是它的一個(gè)可選操作。
  68. String SENDTO_ACTION 動(dòng)作:向 data 指定的接收者發(fā)送一個(gè)消息帕棉。
  69. String SERVICE_STATE_CHANGED_ACTION 廣播:電話服務(wù)的狀態(tài)已經(jīng)改變针肥。
  70. String SETTINGS_ACTION 動(dòng)作:顯示系統(tǒng)設(shè)置。輸入:無(wú)香伴。
  71. String SIGNAL_STRENGTH_CHANGED_ACTION 廣播:電話的信號(hào)強(qiáng)度已經(jīng)改變慰枕。
  72. int SINGLE_TOP_LAUNCH 啟動(dòng)標(biāo)記:設(shè)置以后,如果 activity 已經(jīng)啟動(dòng)即纲,而且位于歷史堆棧的頂端具帮,將不再啟動(dòng)(不重新啟動(dòng)) activity。
  73. String STATISTICS_REPORT_ACTION 廣播:要求 receivers 報(bào)告自己的統(tǒng)計(jì)信息低斋。
  74. String STATISTICS_STATE_CHANGED_ACTION 廣播:統(tǒng)計(jì)信息服務(wù)的狀態(tài)已經(jīng)改變蜂厅。
  75. String SYNC_ACTION 動(dòng)作:執(zhí)行數(shù)據(jù)同步。
  76. String TAB_CATEGORY 類別:這個(gè) activity 應(yīng)該在 TabActivity 中作為一個(gè) tab 使用膊畴。
  77. String TEMPLATE_EXTRA 附加數(shù)據(jù):新記錄的初始化模板掘猿。
  78. String TEST_CATEGORY 類別:作為測(cè)試目的使用,不是正常的用戶體驗(yàn)的一部分唇跨。
  79. String TIMEZONE_CHANGED_ACTION 廣播:時(shí)區(qū)已經(jīng)改變稠通。
  80. String TIME_CHANGED_ACTION 廣播:時(shí)間已經(jīng)改變(重新設(shè)置)。
  81. String TIME_TICK_ACTION 廣播:當(dāng)前時(shí)間已經(jīng)變化(正常的時(shí)間流逝)买猖。
  82. String UMS_CONNECTED_ACTION 廣播:設(shè)備進(jìn)入 USB 大容量存儲(chǔ)模式改橘。
  83. String UMS_DISCONNECTED_ACTION 廣播:設(shè)備從 USB 大容量存儲(chǔ)模式退出。
  84. String UNIT_TEST_CATEGORY 類別:應(yīng)該被用作單元測(cè)試(通過(guò) test harness 運(yùn)行)玉控。
  85. String VIEW_ACTION 動(dòng)作:向用戶顯示數(shù)據(jù)飞主。
  86. String WALLPAPER_CATEGORY 類別:這個(gè) activity 能過(guò)為設(shè)備設(shè)置墻紙。
  87. String WALLPAPER_CHANGED_ACTION 廣播:系統(tǒng)的墻紙已經(jīng)改變高诺。
  88. String WALLPAPER_SETTINGS_ACTION 動(dòng)作:顯示選擇墻紙的設(shè)置界面碌识。輸入:無(wú)。
  89. String WEB_SEARCH_ACTION 動(dòng)作:執(zhí)行 web 搜索虱而。
  90. String XMPP_CONNECTED_ACTION 廣播:XMPP 連接已經(jīng)被建立筏餐。
  91. String XMPP_DISCONNECTED_ACTION 廣播:XMPP 連接已經(jīng)被斷開(kāi)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薛窥,一起剝皮案震驚了整個(gè)濱河市胖烛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诅迷,老刑警劉巖佩番,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罢杉,居然都是意外死亡趟畏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門滩租,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赋秀,“玉大人,你說(shuō)我怎么就攤上這事律想×粤” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵技即,是天一觀的道長(zhǎng)著洼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)而叼,這世上最難降的妖魔是什么身笤? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮葵陵,結(jié)果婚禮上液荸,老公的妹妹穿的比我還像新娘。我一直安慰自己脱篙,他們只是感情好娇钱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著涡尘,像睡著了一般忍弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上考抄,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天细疚,我揣著相機(jī)與錄音,去河邊找鬼川梅。 笑死疯兼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贫途。 我是一名探鬼主播吧彪,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丢早!你這毒婦竟也來(lái)了姨裸?” 一聲冷哼從身側(cè)響起秧倾,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傀缩,沒(méi)想到半個(gè)月后那先,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赡艰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年售淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慷垮。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揖闸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出料身,到底是詐尸還是另有隱情汤纸,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布芹血,位于F島的核電站蹲嚣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祟牲。R本人自食惡果不足惜隙畜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望说贝。 院中可真熱鬧议惰,春花似錦、人聲如沸乡恕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)傲宜。三九已至运杭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間函卒,已是汗流浹背辆憔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留报嵌,地道東北人虱咧。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锚国,于是被迫代替她去往敵國(guó)和親腕巡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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