日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 发送广播_从0系统学Android--5.2 发送广播

發(fā)布時間:2024/7/19 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 发送广播_从0系统学Android--5.2 发送广播 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從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 后進(jìn)行了限制,限制通過靜態(tài)注冊來接受隱式廣播詳見。 其實對于部分隱式廣播也是可以的比如開機(jī)廣播

通過這個限制我們可以得到解決辦法有兩種:

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 來進(jìn)行傳遞的因此我們可以通過 Intent 來攜帶一些數(shù)據(jù)。

5.3.2 發(fā)送有序廣播

廣播是一種跨進(jìn)程的通信,也就是說可以讓不同的應(yīng)用程序進(jìn)行通信

如何發(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 引入了一套本地廣播機(jī)制,使用這個機(jī)制廣播只能夠在程序內(nèi)部進(jìn)行傳遞。其實實現(xiàn)很簡單就是通過 LocalBroadcastManager 來對廣播進(jìn)行管理。

下面我們就來列幾個方法就可以了

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。