安卓的入門基礎(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;
- 繼承于Service類的自定義子類——MyStartService類中,生命周期回調(diào)方法有:onCreate() 砚哗、onStartCommand() 龙助、onDestroy();
- 如果停止服務(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()方法懒熙;
- 在停止服務(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)廣播大全】
- String ADD_SHORTCUT_ACTION 動(dòng)作:在系統(tǒng)中添加一個(gè)快捷方式碍论。
- String ALL_APPS_ACTION 動(dòng)作:列舉所有可用的應(yīng)用谅猾。輸入:無(wú)。
- String ALTERNATIVE_CATEGORY 類別:說(shuō)明 activity 是用戶正在瀏覽的數(shù)據(jù)的一個(gè)可選操作鳍悠。
- String ANSWER_ACTION 動(dòng)作:處理?yè)苋氲碾娫挕?/li>
- String BATTERY_CHANGED_ACTION 廣播:充電狀態(tài)赊瞬,或者電池的電量發(fā)生變化先煎。
- String BOOT_COMPLETED_ACTION 廣播:在系統(tǒng)啟動(dòng)后,這個(gè)動(dòng)作被廣播一次(只有一次)巧涧。
- String BROWSABLE_CATEGORY 類別:能夠被瀏覽器安全使用的 activities 必須支持這個(gè)類別薯蝎。
- String BUG_REPORT_ACTION 動(dòng)作:顯示 activity 報(bào)告錯(cuò)誤。
- String CALL_ACTION 動(dòng)作:撥打電話谤绳,被呼叫的聯(lián)系人在數(shù)據(jù)中指定占锯。
- String CALL_FORWARDING_STATE_CHANGED_ACTION 廣播:語(yǔ)音電話的呼叫轉(zhuǎn)移狀態(tài)已經(jīng)改變。
- String CLEAR_CREDENTIALS_ACTION 動(dòng)作:清除登陸憑證 (credential)缩筛。
- String CONFIGURATION_CHANGED_ACTION 廣播:設(shè)備的配置信息已經(jīng)改變消略,參見(jiàn) Resources.Configuration.
- Creator CREATOR 無(wú) 無(wú)
- String DATA_ACTIVITY_STATE_CHANGED_ACTION 廣播:電話的數(shù)據(jù)活動(dòng)(data activity)狀態(tài)(即收發(fā)數(shù)據(jù)的狀態(tài))已經(jīng)改變。
- String DATA_CONNECTION_STATE_CHANGED_ACTION 廣播:電話的數(shù)據(jù)連接狀態(tài)已經(jīng)改變瞎抛。
- String DATE_CHANGED_ACTION 廣播:日期被改變艺演。
- String DEFAULT_ACTION 動(dòng)作:和 VIEW_ACTION 相同,是在數(shù)據(jù)上執(zhí)行的標(biāo)準(zhǔn)動(dòng)作桐臊。
- String DEFAULT_CATEGORY 類別:如果 activity 是對(duì)數(shù)據(jù)執(zhí)行確省動(dòng)作(點(diǎn)擊, center press)的一個(gè)選項(xiàng)胎撤,需要設(shè)置這個(gè)類別。
- String DELETE_ACTION 動(dòng)作:從容器中刪除給定的數(shù)據(jù)断凶。
- String DEVELOPMENT_PREFERENCE_CATEGORY 類別:說(shuō)明 activity 是一個(gè)設(shè)置面板 (development preference panel).
- String DIAL_ACTION 動(dòng)作:撥打數(shù)據(jù)中指定的電話號(hào)碼伤提。
- String EDIT_ACTION 動(dòng)作:為制定的數(shù)據(jù)顯示可編輯界面。
- String EMBED_CATEGORY 類別:能夠在上級(jí)(父)activity 中運(yùn)行认烁。
- String EMERGENCY_DIAL_ACTION 動(dòng)作:撥打緊急電話號(hào)碼肿男。
- 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舶沛。
- String FOTA_CANCEL_ACTION 廣播:取消所有被掛起的 (pending) 更新下載。
- String FOTA_INSTALL_ACTION 廣播:更新已經(jīng)被確認(rèn)窗价,馬上就要開(kāi)始安裝如庭。
- String FOTA_READY_ACTION 廣播:更新已經(jīng)被下載,可以開(kāi)始安裝舌镶。
- String FOTA_RESTART_ACTION 廣播:恢復(fù)已經(jīng)停止的更新下載。
- String FOTA_UPDATE_ACTION 廣播:通過(guò) OTA 下載并安裝操作系統(tǒng)更新豪娜。
- String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 類別:To be used as code under test for framework instrumentation tests.
- String GADGET_CATEGORY 類別:這個(gè) activity 可以被嵌入宿主 activity (activity that is hosting gadgets)餐胀。
- String GET_CONTENT_ACTION 動(dòng)作:讓用戶選擇數(shù)據(jù)并返回。
- String HOME_CATEGORY 類別:主屏幕 (activity)瘤载,設(shè)備啟動(dòng)后顯示的第一個(gè) activity否灾。
- String INSERT_ACTION 動(dòng)作:在容器中插入一個(gè)空項(xiàng) (item)。
- String INTENT_EXTRA 附加數(shù)據(jù):和 PICK_ACTIVITY_ACTION 一起使用時(shí)鸣奔,說(shuō)明用戶選擇的用來(lái)顯示的 activity墨技;和 ADD_SHORTCUT_ACTION 一起使用的時(shí)候惩阶,描述要添加的快捷方式。
- String LABEL_EXTRA 附加數(shù)據(jù):大寫字母開(kāi)頭的字符標(biāo)簽扣汪,和 ADD_SHORTCUT_ACTION 一起使用断楷。
- String LAUNCHER_CATEGORY 類別:Activity 應(yīng)該被顯示在頂級(jí)的 launcher 中。
- String LOGIN_ACTION 動(dòng)作:獲取登錄憑證崭别。
- String MAIN_ACTION 動(dòng)作:作為主入口點(diǎn)啟動(dòng)冬筒,不需要數(shù)據(jù)。
- String MEDIABUTTON_ACTION 廣播:用戶按下了“Media Button”茅主。
- String MEDIA_BAD_REMOVAL_ACTION 廣播:擴(kuò)展介質(zhì)(擴(kuò)展卡)已經(jīng)從 SD 卡插槽拔出舞痰,但是掛載點(diǎn) (mount point) 還沒(méi)解除 (unmount)。
- String MEDIA_EJECT_ACTION 廣播:用戶想要移除擴(kuò)展介質(zhì)(拔掉擴(kuò)展卡)诀姚。
- String MEDIA_MOUNTED_ACTION 廣播:擴(kuò)展介質(zhì)被插入响牛,而且已經(jīng)被掛載。
- String MEDIA_REMOVED_ACTION 廣播:擴(kuò)展介質(zhì)被移除赫段。
- String MEDIA_SCANNER_FINISHED_ACTION 廣播:已經(jīng)掃描完介質(zhì)的一個(gè)目錄呀打。
- String MEDIA_SCANNER_STARTED_ACTION 廣播:開(kāi)始掃描介質(zhì)的一個(gè)目錄。
- String MEDIA_SHARED_ACTION 廣播:擴(kuò)展介質(zhì)的掛載被解除 (unmount)瑞佩,因?yàn)樗呀?jīng)作為 USB 大容量存儲(chǔ)被共享聚磺。
- String MEDIA_UNMOUNTED_ACTION 廣播:擴(kuò)展介質(zhì)存在,但是還沒(méi)有被掛載 (mount)炬丸。
- String MESSAGE_WAITING_STATE_CHANGED_ACTION 廣播:電話的消息等待(語(yǔ)音郵件)狀態(tài)已經(jīng)改變瘫寝。
- int MULTIPLE_TASK_LAUNCH 啟動(dòng)標(biāo)記:和 NEW_TASK_LAUNCH 聯(lián)合使用,禁止將已有的任務(wù)改變?yōu)榍熬叭蝿?wù) (foreground)稠炬。
- String NETWORK_TICKLE_RECEIVED_ACTION 廣播:設(shè)備收到了新的網(wǎng)絡(luò) "tickle" 通知焕阿。
- int NEW_TASK_LAUNCH 啟動(dòng)標(biāo)記:設(shè)置以后,activity 將成為歷史堆棧中的第一個(gè)新任務(wù)(棧頂)首启。
- int NO_HISTORY_LAUNCH 啟動(dòng)標(biāo)記:設(shè)置以后暮屡,新的 activity 不會(huì)被保存在歷史堆棧中。
- String PACKAGE_ADDED_ACTION 廣播:設(shè)備上新安裝了一個(gè)應(yīng)用程序包毅桃。
- String PACKAGE_REMOVED_ACTION 廣播:設(shè)備上刪除了一個(gè)應(yīng)用程序包褒纲。
- String PHONE_STATE_CHANGED_ACTION 廣播:電話狀態(tài)已經(jīng)改變。
- String PICK_ACTION 動(dòng)作:從數(shù)據(jù)中選擇一個(gè)項(xiàng)目 (item)钥飞,將被選中的項(xiàng)目返回莺掠。
- String PICK_ACTIVITY_ACTION 動(dòng)作:選擇一個(gè) activity,返回被選擇的 activity 的類(名)读宙。
- String PREFERENCE_CATEGORY 類別:activity是一個(gè)設(shè)置面板 (preference panel)彻秆。
- String PROVIDER_CHANGED_ACTION 廣播:更新將要(真正)被安裝。
- String PROVISIONING_CHECK_ACTION 廣播:要求 polling of provisioning service 下載最新的設(shè)置。
- String RUN_ACTION 動(dòng)作:運(yùn)行數(shù)據(jù)(指定的應(yīng)用)唇兑,無(wú)論它(應(yīng)用)是什么酒朵。
- String SAMPLE_CODE_CATEGORY 類別:To be used as an sample code example (not part of the normal user experience).
- String SCREEN_OFF_ACTION 廣播:屏幕被關(guān)閉。
- String SCREEN_ON_ACTION 廣播:屏幕已經(jīng)被打開(kāi)扎附。
- String SELECTED_ALTERNATIVE_CATEGORY 類別:對(duì)于被用戶選中的數(shù)據(jù)蔫耽,activity 是它的一個(gè)可選操作。
- String SENDTO_ACTION 動(dòng)作:向 data 指定的接收者發(fā)送一個(gè)消息帕棉。
- String SERVICE_STATE_CHANGED_ACTION 廣播:電話服務(wù)的狀態(tài)已經(jīng)改變针肥。
- String SETTINGS_ACTION 動(dòng)作:顯示系統(tǒng)設(shè)置。輸入:無(wú)香伴。
- String SIGNAL_STRENGTH_CHANGED_ACTION 廣播:電話的信號(hào)強(qiáng)度已經(jīng)改變慰枕。
- int SINGLE_TOP_LAUNCH 啟動(dòng)標(biāo)記:設(shè)置以后,如果 activity 已經(jīng)啟動(dòng)即纲,而且位于歷史堆棧的頂端具帮,將不再啟動(dòng)(不重新啟動(dòng)) activity。
- String STATISTICS_REPORT_ACTION 廣播:要求 receivers 報(bào)告自己的統(tǒng)計(jì)信息低斋。
- String STATISTICS_STATE_CHANGED_ACTION 廣播:統(tǒng)計(jì)信息服務(wù)的狀態(tài)已經(jīng)改變蜂厅。
- String SYNC_ACTION 動(dòng)作:執(zhí)行數(shù)據(jù)同步。
- String TAB_CATEGORY 類別:這個(gè) activity 應(yīng)該在 TabActivity 中作為一個(gè) tab 使用膊畴。
- String TEMPLATE_EXTRA 附加數(shù)據(jù):新記錄的初始化模板掘猿。
- String TEST_CATEGORY 類別:作為測(cè)試目的使用,不是正常的用戶體驗(yàn)的一部分唇跨。
- String TIMEZONE_CHANGED_ACTION 廣播:時(shí)區(qū)已經(jīng)改變稠通。
- String TIME_CHANGED_ACTION 廣播:時(shí)間已經(jīng)改變(重新設(shè)置)。
- String TIME_TICK_ACTION 廣播:當(dāng)前時(shí)間已經(jīng)變化(正常的時(shí)間流逝)买猖。
- String UMS_CONNECTED_ACTION 廣播:設(shè)備進(jìn)入 USB 大容量存儲(chǔ)模式改橘。
- String UMS_DISCONNECTED_ACTION 廣播:設(shè)備從 USB 大容量存儲(chǔ)模式退出。
- String UNIT_TEST_CATEGORY 類別:應(yīng)該被用作單元測(cè)試(通過(guò) test harness 運(yùn)行)玉控。
- String VIEW_ACTION 動(dòng)作:向用戶顯示數(shù)據(jù)飞主。
- String WALLPAPER_CATEGORY 類別:這個(gè) activity 能過(guò)為設(shè)備設(shè)置墻紙。
- String WALLPAPER_CHANGED_ACTION 廣播:系統(tǒng)的墻紙已經(jīng)改變高诺。
- String WALLPAPER_SETTINGS_ACTION 動(dòng)作:顯示選擇墻紙的設(shè)置界面碌识。輸入:無(wú)。
- String WEB_SEARCH_ACTION 動(dòng)作:執(zhí)行 web 搜索虱而。
- String XMPP_CONNECTED_ACTION 廣播:XMPP 連接已經(jīng)被建立筏餐。
- String XMPP_DISCONNECTED_ACTION 廣播:XMPP 連接已經(jīng)被斷開(kāi)。