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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android BrocastReceiver解析

發布時間:2025/5/22 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android BrocastReceiver解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

BroadcastReceiver(廣播接收器)是Android四大組件之一,是一個用來響應系統范圍內的廣播組件,可以從Android系統和其它app發送或接收廣播消息,類似于發布 - 訂閱設計模式。其特點是異步的,廣播發送者不會關心有無接收者接收。可應用于不同組件之間的通信、多線程通信和系統在特定情況下的通信。

原理


對于不同的廣播類型,以及不同的BroadcastReceiver注冊方式,具體實現上會有不同。但總體流程大致如下:

  • 廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行注冊;
  • 廣播發送者通過Binder機制向AMS發送廣播;
  • AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的消息循環隊列中;
  • 消息循環執行拿到此廣播,回調BroadcastReceiver中的onReceive()方法。

    類型

    • 普通廣播(Normal Broadcast)

    普通廣播是完全異步的,通過Context的sendBroadcast()方法來發送,消息傳遞效率比較高,但所有receivers(接收器)的執行順序不確定。缺點是接收器不能將處理結果傳遞給下一個接收器,并且無法在中途終止廣播。

    val intent = Intent() intent.action = RECEIVE_TOKEN sendBroadcast(intent)
    • 系統廣播(System Broadcast)

    Android系統中內置了多個系統廣播,只要涉及到手機的基本操作,基本上都會發出相應的系統廣播。如:開機啟動,充電與電量變化,網絡狀態改變,拍照,屏幕關閉與開啟等。每個系統廣播都具有特定的intent-filter,其中主要包括具體的action,系統廣播發出后,將被相應的BroadcastReceiver接收。

    • 有序廣播(Ordered Broadcast)

    “有序”是針對廣播接收者而言的,指的是發送出去的廣播被BroadcastReceiver按照先后循序接收,通過receiver的intent-filter中的android:priority屬性來設置優先級,優先級從-1000~1000,數越大,優先級越高;priority屬性相同者,動態注冊的廣播優先。其使用過程與普通廣播非常類似,差異僅在于廣播的發送方式通過Context.sendOrderedBroadcast()方法發送。

    • App應用內廣播(Local Broadcast)

    Android中的廣播可以跨App直接通信,可能會帶來消耗性能和容易引起安全性的問題,為了解決這些問題,將全局廣播設置成局部廣播或者使用封裝好的LocalBroadcastManager(只能動態注冊)類。
    設置局部廣播方式:

    • 注冊廣播時將exported屬性設置為false
    • 增設相應權限permission,用于權限驗證
    • 指定該廣播接收器所在的包名

    LocalBroadcastManager使用

    //注冊廣播,在Activity.onResume注冊 val intentFilter = IntentFilter() val broadcastReceiver = BroadcastReceiver() intentFilter.addAction(RECEIVE_TOKEN) LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter) //發送廣播 val intent = Intent() intent.action = RECEIVE_TOKEN LocalBroadcastManager.getInstance(this).sendBroadcast(intent) //取消廣播,在Activity.onPause取消 LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)

    注冊

    • 靜態注冊

    直接在Manifest.xml文件的節點中配置,使用< receiver >標簽聲明,并在標簽內用?< intent-filter >?標簽設置過濾器,該注冊方式不管app是否處于活動狀態,都會進行監聽。

    <receiver android:name=".BroadcastReceiver" // 繼承BroadcastReceiver子類的類名android:enabled="boolean" // 能否接收其他App的發出的廣播android:exported="boolean" // 默認值是由receiver中有無intent-filter決定的:如果有intent-filter,默認值為true,否則為falseandroid:icon="drawable resource" // 廣播iconandroid:label="string resource" // 廣播標簽android:permission="string" // 具有相應權限的廣播發送者發送的廣播才能被此BroadcastReceiver所接收android:process="string"> // 指定自己的獨立進程<intent-filter><action android:name="com.fomin.demo.ACTION_RECEIVE_TOKEN"/></intent-filter> </receiver>

    但需要注意的是,Android8.0系統對靜態廣播做了變更,具體可查看[https://blog.csdn.net/fomin_zhu/article/details/84454042]

    • 動態注冊

    直接在代碼在代碼中調用Context.registerReceiver()方法注冊和調用unregisterReceiver
    取消注冊

    override fun onResume() {super.onResume()//注冊廣播,在Activity.onResume注冊val intentFilter = IntentFilter()intentFilter.addAction(RECEIVE_TOKEN)LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter) }override fun onPause() {super.onPause()//取消廣播,在Activity.onPause取消 LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver) }

    動態廣播最好在Activity?的?onResume()注冊、onPause()注銷,是因為對于動態廣播,有注冊就必然得有注銷,否則會導致內存泄露;在onResume()注冊、onPause()注銷是因為onPause()在App死亡前一定會被執行,從而保證廣播在App死亡前一定會被注銷,從而防止內存泄露。

    • 兩者區別
    • 靜態注冊在Manifest.xml注冊,動態在代碼上調用
    • 靜態是常駐的,不受生命周期影響,并且耗電和占內存;而動態是使用才注冊,跟隨組件生命周期

    注意

    不同注冊方式的廣播接收器回調OnReceive()中的context返回值是不一樣的

    • 靜態注冊廣播,content是android.app.ReceiverRestrictedContext,此context非Activity類型,不可直接用來構造AlertDialog
    • 動態注冊廣播,傳入onReceive()方法里的Context對象context其實就是調用sendBroadcast()的Activty對象;但LocalBroadcastManager方式返回的是Application Context

    轉載于:https://www.cnblogs.com/fomin/p/10490848.html

    總結

    以上是生活随笔為你收集整理的Android BrocastReceiver解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成年人www| 欧美在线视频网站 | 国产粉嫩呻吟一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 一级做a爰片毛片 | 丰满人妻一区二区三区53号 | 久久99精品久久久久久噜噜 | 女人张开腿让男人桶爽 | 成人h动漫精品一区二区无码 | aa片在线观看视频在线播放 | 深爱婷婷网 | 色网av| 农村末发育av片一区二区 | 亚洲女人天堂成人av在线 | 动漫美女被x | 免费成人深夜 | 少妇一级淫片免费观看 | 三级免费黄 | 黄色一区二区三区 | 国产亚洲成人av | 久久精品国产亚洲av麻豆 | 国产黄色大片视频 | 91香蕉国产在线观看软件 | 天使色吧 | www.av视频在线观看 | 青青艹av | 深夜免费福利视频 | 制服av在线 | 亚洲欧美一区二区三区不卡 | 国产成人av在线 | jizz中国少妇高潮出水 | 青娱乐91视频 | 爆操网站 | 欧美性猛交xxxxx水多 | 国内自拍第二页 | 久久99精品国产麻豆婷婷 | 亚洲精品中文在线 | 精品国产乱码久久久久 | 九九九九九精品 | 日韩欧美字幕 | 国内毛片毛片毛片 | 在线观看一二三区 | 成人在线观看网 | 99久久久久久久 | 国产精品玖玖玖 | 国产美女极度色诱视频www | 人妻一区二区三区视频 | 一本久道久久综合无码中文 | 国产av第一区| av无码一区二区三区 | 香港三日本三级少妇66 | 黄色av网站免费看 | 成人做受视频试看60秒 | 国产第一草草影院 | 猛男大粗猛爽h男人味 | 同心兄弟| 国内视频一区二区三区 | 欧洲三级在线 | 日韩精品在线免费观看 | 国产精品1区2区3区4区 | 91黄瓜视频| 日韩在线国产 | 91香蕉视频在线看 | 欧美一区二区三区网站 | 91成人福利视频 | 梦梦电影免费高清在线观看 | 雪白的扔子视频大全在线观看 | 丰满人妻一区二区三区53 | 欧美老熟妇又粗又大 | 污视频在线免费观看 | 久久a级片 | 99精品久久久 | 看污网站 | jizz中国少妇 | 久久午夜国产 | 香蕉网在线| 亚洲午夜伦理 | av爱爱爱 | 日本一区二区网站 | 免费av电影网址 | 朴麦妮原版视频高清资源 | 国产精品一线天 | 一区二区看片 | 在线成人免费电影 | 麻豆中文字幕 | 秘密基地免费观看完整版中文 | 美女福利视频一区 | 激情婷婷六月 | 亚洲福利国产 | 人成在线免费视频 | 9999精品| 成人免费av网站 | 成人免费在线视频 | 午夜影院男女 | 绯色av一区二区三区高清 | 国产农村妇女毛片精品 | 欧美日韩一区免费 | 另类性姿势bbwbbw | 国产精品天干天干 |