欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?廣播接收器BroadcastReceiver詳解

 更新時(shí)間:2022年10月09日 11:06:01   作者:半身風(fēng)雪  
Android開(kāi)發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件

一、什么是BroadcastReceiver

BroadcastReceiver 是安卓系統(tǒng)中四大組件之一,在Android開(kāi)發(fā)中,BroadcastReceiver的應(yīng)用場(chǎng)景非常多,Android 廣播分為兩個(gè)角色:廣播發(fā)送者、廣播接收者。

1.1、作用

廣播接收器用于響應(yīng)來(lái)自其他應(yīng)用程序或者系統(tǒng)的廣播消息。

  • 不同組件之間通信(包括應(yīng)用內(nèi) / 不同應(yīng)用之間)
  • 與 Android 系統(tǒng)在特定情況下的通信(如當(dāng)電話呼入時(shí)、網(wǎng)絡(luò)可用時(shí))
  • 多線程通信

1.2、實(shí)現(xiàn)原理

Android中的廣播使用了設(shè)計(jì)模式中的觀察者模式:基于消息的發(fā)布/訂閱事件模型。

模型中有3個(gè)角色:

  • 消息訂閱者(廣播接收者)
  • 消息發(fā)布者(廣播發(fā)布者)
  • 消息中心(AMS,即Activity Manager Service)

廣播接收者通過(guò) Binder機(jī)制在AMS注冊(cè)

廣播發(fā)送者通過(guò) Binder 機(jī)制向AMS發(fā)送廣播

AMS根據(jù)廣播發(fā)送者要求,在已注冊(cè)列表中,尋找合適的廣播接收者(尋找依據(jù):IntentFilter / Permission)

AMS將廣播發(fā)送到合適的廣播接收者相應(yīng)的消息循環(huán)隊(duì)列中;

廣播接收者通過(guò)消息循環(huán)拿到此廣播,并回調(diào) onReceive()

二、創(chuàng)建廣播接收器

廣播接收器需要實(shí)現(xiàn)為BroadcastReceiver類的子類,并重寫(xiě)onReceive()方法來(lái)接收以Intent對(duì)象為參數(shù)的消息。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("我是創(chuàng)建好的通知");
    }
}

三、注冊(cè)廣播接收器

廣播接收器的注冊(cè)分為兩種:

  • 靜態(tài)注冊(cè)
  • 動(dòng)態(tài)注冊(cè)

3.1、靜態(tài)注冊(cè)

應(yīng)用程序通過(guò)在AndroidManifest.xml中注冊(cè)廣播接收器來(lái)監(jiān)聽(tīng)制定的廣播意圖。

注冊(cè)

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".MyReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.tiger_test"
            tools:ignore="BatteryLife" />
    </intent-filter>
</receiver>

發(fā)送通知

在Activity 中新增一個(gè)發(fā)送通知的點(diǎn)擊事件

    public void onClickStatic(View view) {
        System.out.println("MainActivity2.onClickStatic");
//        com.tiger_test 必須和清單文件中注冊(cè)的保持一致
        Intent intent = new Intent();
        intent.setAction("com.tiger_test");
        intent.setPackage("com.traveleasy.activitydemo");
        sendBroadcast(intent);
    }

當(dāng)點(diǎn)擊通知發(fā)送按鈕時(shí),系統(tǒng)會(huì)自動(dòng)實(shí)例化MyReceiver類,并注冊(cè)到系統(tǒng)中。

靜態(tài)注冊(cè)是常駐廣播,不受任何組件生命周期的影響

注意:由于自8.0以后隱式廣播不能進(jìn)行靜態(tài)注冊(cè)了,所以這里通過(guò)setPackage()指定應(yīng)用程序響應(yīng)廣播。

3.2、動(dòng)態(tài)注冊(cè)

通過(guò)registerReceiver()注冊(cè)廣播監(jiān)聽(tīng)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
//        在onCreate 中注冊(cè)廣播
        MyReceiver myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.tiger_test");
        registerReceiver(myReceiver, filter);
    }

觸發(fā)通知

public void onClickStatic(View view) {
    //        com.tiger_test 必須和注冊(cè)的保持一致
    Intent intent = new Intent();
    intent.setAction("com.tiger_test");
    sendBroadcast(intent);
}

在頁(yè)面關(guān)閉時(shí)記得通過(guò)unregisterReceiver()注銷廣播監(jiān)聽(tīng),否則會(huì)因廣播持有Activity引用導(dǎo)致內(nèi)存泄露。

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
}

運(yùn)行結(jié)果

需要注意,在onReceive()不能執(zhí)行耗時(shí)操作,onReceive()默認(rèn)是在主線程中,進(jìn)行耗時(shí)會(huì)阻塞主線程,如果非要執(zhí)行耗時(shí)操作最好開(kāi)啟一個(gè)服務(wù)在服務(wù)中進(jìn)行耗時(shí)操作,不建議開(kāi)啟線程來(lái)處理耗時(shí)操作,因?yàn)锽roadCastReceiver的生命周期很短,可能在子線程結(jié)束前BroadCastReceiver已經(jīng)退出,如果當(dāng)BroadCastReceiver所在的進(jìn)程結(jié)束,雖然該進(jìn)程中可能有用戶啟動(dòng)的新線程,但是由于該進(jìn)程內(nèi)沒(méi)有活動(dòng)的組件,系統(tǒng)會(huì)在內(nèi)存緊張的時(shí)候,優(yōu)先結(jié)束掉該進(jìn)程,這就會(huì)導(dǎo)致BroadCastReceiver啟動(dòng)的子線程不能執(zhí)行完。

四、系統(tǒng)廣播

上面我們一起學(xué)習(xí)了自定義廣播,下面我們一起來(lái)看一下Android 系統(tǒng)主要的系統(tǒng)廣播類型。

事件常量描述
android.intent.action.BATTERY_CHANGED持久的廣播,包含電池的充電狀態(tài),級(jí)別和其他信息。
android.intent.action.BATTERY_LOW標(biāo)識(shí)設(shè)備的低電量條件。
android.intent.action.BATTERY_OKAY標(biāo)識(shí)電池在電量低之后,現(xiàn)在已經(jīng)好了。
android.intent.action.BOOT_COMPLETED在系統(tǒng)完成啟動(dòng)后廣播一次。
android.intent.action.BUG_REPORT顯示報(bào)告bug的活動(dòng)。
android.intent.action.CALL執(zhí)行呼叫數(shù)據(jù)指定的某人。
android.intent.action.CALL_BUTTON用戶點(diǎn)擊"呼叫"按鈕打開(kāi)撥號(hào)器或者其他撥號(hào)的合適界面。
android.intent.action.DATE_CHANGED日期發(fā)生改變。
android.intent.action.REBOOT設(shè)備重啟。

總結(jié)

在BroadcastReceiver 中,廣播的類型主要分為兩大類

  • 標(biāo)注廣播
  • 有序廣播

標(biāo)準(zhǔn)廣播

標(biāo)準(zhǔn)廣播是一種完全異步執(zhí)行的廣播,在廣播發(fā)出之后,所有的BroadcastReceiver幾乎在同一時(shí)刻收到這個(gè)廣播消息,它們之間沒(méi)有先后順序,這種廣播的效率較高,并且不能被攔截。

有序廣播

有序廣播是一種完全同步的廣播,在廣播發(fā)出后只能有一個(gè)BroadcastReceiver能接收到這個(gè)廣播消息,當(dāng)這個(gè)BroadcastReceiver中的邏輯執(zhí)行完畢后,廣播才能繼續(xù)向下傳遞。所以這個(gè)廣播是有順序的,所以這種廣播也是可以被攔截的,如果被攔截了后面的BroadCastReceiver則不能收到廣播消息了。

到此這篇關(guān)于Android 廣播接收器BroadcastReceiver詳解的文章就介紹到這了,更多相關(guān)Android BroadcastReceiver內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • android 使用虛擬機(jī)安裝apk(圖文教程)

    android 使用虛擬機(jī)安裝apk(圖文教程)

    android 使用虛擬機(jī)安裝apk對(duì)一些新手朋友會(huì)很陌生,今天教大家使用使用虛擬機(jī)安裝apk文件,步驟很詳細(xì),有需要的朋友可以參考下
    2012-12-12
  • Android 獲取 usb 權(quán)限的兩種方法

    Android 獲取 usb 權(quán)限的兩種方法

    這篇文章主要介紹了Android 獲取 usb 權(quán)限的兩種方式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Android編程中Tween動(dòng)畫(huà)和Frame動(dòng)畫(huà)實(shí)例分析

    Android編程中Tween動(dòng)畫(huà)和Frame動(dòng)畫(huà)實(shí)例分析

    這篇文章主要介紹了Android編程中Tween動(dòng)畫(huà)和Frame動(dòng)畫(huà),結(jié)合實(shí)例形式較為詳細(xì)的分析了Android中Tween動(dòng)畫(huà)和Frame動(dòng)畫(huà)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • Android ViewPager循環(huán)播放廣告實(shí)例詳解

    Android ViewPager循環(huán)播放廣告實(shí)例詳解

    這篇文章主要介紹了Android ViewPager循環(huán)播放廣告條實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Android源碼解析之屬性動(dòng)畫(huà)詳解

    Android源碼解析之屬性動(dòng)畫(huà)詳解

    在手機(jī)上去實(shí)現(xiàn)動(dòng)畫(huà)效果算是件比較炫酷的事情,自Android 3.0版本開(kāi)始,系統(tǒng)給我們提供了一種全新的動(dòng)畫(huà)模式,屬性動(dòng)畫(huà)(property animation),它的功能非常強(qiáng)大,彌補(bǔ)了之前補(bǔ)間動(dòng)畫(huà)的一些缺陷,幾乎是可以完全替代掉補(bǔ)間動(dòng)畫(huà)了。本文就詳細(xì)介紹了Android中的屬性動(dòng)畫(huà)。
    2017-02-02
  • 淺析Android錄屏 MediaRecorder

    淺析Android錄屏 MediaRecorder

    MediaRecorder類是Android sdk提供的一個(gè)專門(mén)用于音視頻錄制,一般利用手機(jī)麥克風(fēng)采集音頻,攝像頭采集圖片信息。這篇文章主要介紹了Android錄屏 MediaRecorder介紹,需要的朋友可以參考下
    2020-03-03
  • Sql Server2008遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法

    Sql Server2008遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法

    這篇文章主要為大家詳細(xì)介紹了Sql Server2008遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 完美解決android 項(xiàng)目jar包沖突的問(wèn)題

    完美解決android 項(xiàng)目jar包沖突的問(wèn)題

    這篇文章主要介紹了完美解決android 項(xiàng)目jar包沖突的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Android入門(mén)之PopupWindow用法實(shí)例解析

    Android入門(mén)之PopupWindow用法實(shí)例解析

    這篇文章主要介紹了Android入門(mén)之PopupWindow用法,對(duì)于Android初學(xué)者來(lái)說(shuō)有一定的學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng)

    Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng)

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論