android 发送广播_从0系统学Android--5.2 发送广播
從0系統(tǒng)學(xué)Android--52 發(fā)送廣播
本系列文章目錄:更多精品文章分類
本系列持續(xù)更新中…. 初級階段內(nèi)容參考《第一行代碼》
5.3 發(fā)送自定義廣播
前面已經(jīng)學(xué)習(xí)了如何接受廣播了,下面來學(xué)習(xí)如何發(fā)送自定義廣播,廣播類型分為:標(biāo)準(zhǔn)廣播和有序廣播,下面分別來說一下這兩種廣播如何發(fā)送。
5.3.1 發(fā)送標(biāo)準(zhǔn)廣播
首先我們先創(chuàng)建一個廣播接收器,用來接收我們發(fā)送的自定義廣播。
用靜態(tài)廣播來實現(xiàn)
public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"接收到了",Toast.LENGTH_SHORT).show();} }<receiverandroid:name="com.example.firstcode.fifty_chapter.norboardcast.MyReceiver"android:enabled="true"android:exported="true"android:permission="no"><intent-filter><action android:name="com.my_broadcast"/></intent-filter></receiver>這里 action 里面寫自己要發(fā)送的廣播的名字就可以了隨便在一個頁面添加發(fā)送代碼:
buttonSend.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.my_broadcast");sendBroadcast(intent);}});需要注意一點,上面的這種做法在 Android 8.0前是好用的,在 8.0 后進行了限制,限制通過靜態(tài)注冊來接受隱式廣播詳見。 其實對于部分隱式廣播也是可以的比如開機廣播
通過這個限制我們可以得到解決辦法有兩種:
1.不通過靜態(tài)注冊接收器,通過動態(tài)注冊就可以了
2.通過靜態(tài)注冊接收器,但是發(fā)送的廣播不要是隱式的。
第一種很簡單,就是動態(tài)注冊,這里不演示了,演示第二種:
buttonSend.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.my_broadcast");// 明確指明要此廣播要發(fā)送給的組件intent.setComponent(new ComponentName(NetChangeActivity.this, MyReceiver.class));NetChangeActivity.this.sendBroadcast(intent);}});由于廣播是通過 Intent 來進行傳遞的因此我們可以通過 Intent 來攜帶一些數(shù)據(jù)。
5.3.2 發(fā)送有序廣播
廣播是一種跨進程的通信,也就是說可以讓不同的應(yīng)用程序進行通信
如何發(fā)送有序廣播呢?
NetChangeActivity.this.sendOrderedBroadcast(intent,null);這樣就是發(fā)送有序廣播了,第二個參數(shù)是與權(quán)限有關(guān),傳入 null 就可以了
那么如何設(shè)置接收器接受的順序呢?
<intent-filter android:priority="100"><action android:name="com.my_broadcast.MY_BROADCAST"/></intent-filter>通過 android:priority 來設(shè)置。同樣接收器在接收到消息后也可以通過 abortBroadcast() 來截取廣播,讓后面的接收器無法再接受到這條廣播。
5.4 使用本地廣播
前面我們發(fā)送和接受的廣播全部屬于系統(tǒng)全局廣播,也就是說這些廣播可以被系統(tǒng)中的其他應(yīng)用程序接收到,并且我們也可以接受到來自其他任何應(yīng)用的廣播。這樣容易引起安全問題。
為了解決這個問題,Android 引入了一套本地廣播機制,使用這個機制廣播只能夠在程序內(nèi)部進行傳遞。其實實現(xiàn)很簡單就是通過 LocalBroadcastManager 來對廣播進行管理。
下面我們就來列幾個方法就可以了
LocalBroadCastManager localBroadCastManager = LocalBroadCastManager.getInstance(this)// 獲取實例 // 發(fā)送廣播的時候 Intent intent = new Intent("com.broadcst.syd"); localBroadCastManager.senBroadCast(intent);// 注冊廣播接收器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.broadcst.syd"); localBroadCastManager.registerReceiver(localReceiver,intentFilter);// 取消注冊 localBroadCastManager.unregisterReceiver(localReceiver);其實和之前動態(tài)注冊發(fā)送都是一樣的,只是換了一個類來執(zhí)行而已。
本地廣播是無法通過靜態(tài)注冊的 ,這很好理解,靜態(tài)注冊是為了讓應(yīng)用程序還沒有啟動就能接受廣播,而發(fā)送本地廣播的時候,程序肯定已經(jīng)啟動了,因此完全不需要靜態(tài)注冊了。
注意這里的本地指的是當(dāng)前應(yīng)用程序內(nèi)
使用本地廣播優(yōu)勢:
- 明確的知道發(fā)送的廣播不會離開我們的應(yīng)用程序,不用擔(dān)心泄漏信息。
- 同樣其他廣播也無法發(fā)送到我們程序內(nèi)部,不用擔(dān)心有安全漏洞。
- 發(fā)送本地廣播比發(fā)送系統(tǒng)全局廣播將會更加高效
總結(jié)
以上是生活随笔為你收集整理的android 发送广播_从0系统学Android--5.2 发送广播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装入归档文件时出现了一个错误linux_
- 下一篇: python 首次登陆outlook 脚