大家好,我們之前一直在進(jìn)行各種控件的學(xué)習(xí)明未,像Recyclerview,Listview壹蔓,Spinner等等趟妥,這些都是我們能看到的東西。
我們說(shuō)android有四大組件庶溶,而這四種組件中煮纵,只有Activity是可視,能直接跟用戶有交互的偏螺,除了這個(gè)之外還有三種,他們是我們不可見(jiàn)得匆光,但是在程序中起著很重要的作用套像,今天我們來(lái)看一下四大組件之一的廣播接收者BroadcastReceiver。
我們大家都聽(tīng)過(guò)廣播吧终息,在學(xué)校的時(shí)候大喇叭發(fā)一條廣播:“廣播通知夺巩,廣播通知,高一四班的李一鳴同學(xué)周崭,你媽媽拿了旺仔牛奶在學(xué)校門(mén)口等柳譬。。续镇。美澳。。≈聘”舅桩,然后,學(xué)校所有的喇叭都想起來(lái)了這條廣播雨膨。我們不管這個(gè)同學(xué)尷不尷尬擂涛,我們只需要在意這個(gè)廣播的機(jī)制。
我們可以這樣理解:
這張圖表達(dá)的意思應(yīng)該很明確了:一個(gè)地方發(fā)送一條廣播聊记,然后所有的喇叭都接收到了撒妈,并執(zhí)行了一個(gè)操作:把這段話播放出來(lái)。
如果我們把它抽象出來(lái)排监,就是這樣子的:
這個(gè)就是我們Android的廣播機(jī)制狰右。
在寫(xiě)代碼之前,我們要先介紹一下這個(gè)BroadcastReceiver社露,
首先它分為兩種廣播:標(biāo)準(zhǔn)廣播和有序廣播挟阻。
標(biāo)準(zhǔn)廣播就是完全的異步廣播:我們都知道異步是什么意思,標(biāo)準(zhǔn)廣播在發(fā)出后峭弟,幾乎所有的BroadcastReceiver都可以在同一時(shí)刻接收到廣播附鸽。
有序廣播就正好相反了:他是一個(gè)同步的廣播,在同一時(shí)刻只能有一個(gè)BroadcastReceiver接收到廣播瞒瘸。
接下來(lái)我們來(lái)一下如何創(chuàng)建BroadcastReceiver坷备。
創(chuàng)建BroadcastReceiver
創(chuàng)建BroadcastReceiver有兩種方式:靜態(tài)實(shí)現(xiàn)和動(dòng)態(tài)實(shí)現(xiàn)(這個(gè)跟之前學(xué)的東西有點(diǎn)像吧)。靜態(tài)實(shí)現(xiàn)是通過(guò)XML注冊(cè)的情臭,而動(dòng)態(tài)實(shí)現(xiàn)是完全java代碼實(shí)現(xiàn)省撑。這兩種實(shí)現(xiàn)有什么區(qū)別呢?我們先來(lái)試驗(yàn)一下俯在。
1.通過(guò)靜態(tài)注冊(cè)BroadcastReceiver
1.首先我們需要一個(gè)類去繼承BroadcastReceiver
我們注意到他需要重寫(xiě)一個(gè)onReceive方法竟秫,當(dāng)我們的廣播接收者接收到對(duì)應(yīng)的廣播之后,就會(huì)跳轉(zhuǎn)到onReceive方法中跷乐,執(zhí)行對(duì)應(yīng)的方法肥败。
2.manifest注冊(cè)
我們action中添加了name屬性,值為zy.pers.MY_APPLICAITON愕提,這個(gè)其實(shí)是自己寫(xiě)的馒稍,你要是開(kāi)心想寫(xiě)asd都可以。
3.使用
我們添加一個(gè)button浅侨,用來(lái)發(fā)送廣播
現(xiàn)在我們來(lái)看一看效果:
好了纽谒,有人會(huì)問(wèn)我們剛才在manifest中添加的action 的name屬性沒(méi)用到啊如输?你想用的話現(xiàn)在就可以用了鼓黔。
我把剛才的intent構(gòu)造方法內(nèi)參數(shù)改為了剛才的actionname央勒,沒(méi)錯(cuò),這個(gè)方法就是隱式調(diào)用了我們的Receiver请祖。我們的Intent可以根據(jù)我們的actionname订歪,進(jìn)行各種跳轉(zhuǎn),如Activity肆捕,Service刷晋,BroadcastReceiver。這里我們給MyReceiver的actionname設(shè)置為這個(gè)值慎陵,所以他會(huì)發(fā)送一條廣播眼虱。然后效果同上的,就不展示了席纽。
這是我們BroadcastReceiver的靜態(tài)注冊(cè)用法捏悬。接下來(lái)我們看一下動(dòng)態(tài)注冊(cè):
2.通過(guò)動(dòng)態(tài)注冊(cè)BroadcastReceiver
我們還是用剛才的那個(gè)MyReceiver類,現(xiàn)在我們?cè)诖a中new一個(gè)對(duì)象润梯。
這個(gè)IntentFilter類是不是看著很熟悉呢过牙?我們?cè)赬Ml中剛才就有這個(gè)標(biāo)簽,然后我們執(zhí)行addAction方法纺铭,給他添加action寇钉。這個(gè)過(guò)程等同于我們剛才在xml中添加action標(biāo)簽的name屬性。
最后一步注冊(cè)監(jiān)聽(tīng)器舶赔,你可以理解為把這個(gè)IntentFilter給這個(gè)receiver扫倡。
然后點(diǎn)擊事件不變,同樣是發(fā)送廣播竟纳。
對(duì)了撵溃,別忘了把剛才xml中注冊(cè)的代碼刪除了。
我們來(lái)看一下效果:
對(duì)了锥累,動(dòng)態(tài)注冊(cè)在onDestroy方法一定要記得解除注冊(cè)
效果相同缘挑,同樣可以實(shí)現(xiàn)廣播。
靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)的區(qū)別
首先桶略,我們有兩種注冊(cè)方式卖哎,那他們肯定是有區(qū)別的,本人不廢話了删性,直接上表格:
其實(shí)說(shuō)白了就是三點(diǎn):
1.靜態(tài)可以顯示啟動(dòng),也可以隱試啟動(dòng)焕窝;而動(dòng)態(tài)只能隱試啟動(dòng)
2.靜態(tài)可以不寫(xiě)action蹬挺,直接通過(guò)類名.class進(jìn)行調(diào)用;動(dòng)態(tài)必須寫(xiě)action它掂。
3.當(dāng)BroadcastReceiver為內(nèi)部類的時(shí)候巴帮,如果是靜態(tài)注冊(cè)溯泣,那一定要寫(xiě)成靜態(tài)內(nèi)部類(這個(gè)原因這里就不說(shuō)了,大家去看一下java內(nèi)部類的知識(shí)就可以理解一二了)榕茧。
4.其實(shí)還有第四點(diǎn)-垃沦。+:我們BroadcastReceiver不但可以在當(dāng)前app發(fā)送廣播,也可以在不同App發(fā)送廣播(喚醒就是這個(gè)原理)用押。但是大家想一下肢簿,如果我們app1的Activity已經(jīng)退出,執(zhí)行了onDestroy方法蜻拨,那么他肯定就沒(méi)辦法在接收廣播了池充,因?yàn)榇藭r(shí)連接收者對(duì)象都沒(méi)有;
而靜態(tài)注冊(cè)就不同了缎讼,他的接收者是一直存在的收夸,所以這也是靜態(tài)注冊(cè)的一個(gè)優(yōu)勢(shì)吧。