Android四大組件之BroadcastReceiver

什么是BroadcastReceiver?

? ? ? BroadcastReceiver(廣播接收器),顧名思義,是用來接收廣播的。Android內部實現了一套廣播通信機制,即在某個應用或某個組件注冊廣播接收器,接收特定類型的廣播。當別的應用或組件發送該類型的廣播時,注冊廣播接收器的組件或應用就能接收到該廣播,并執行相應的操作,這非常類似于觀察者模式。

?

如何使用BroadcastReceiver?

? ? ??BroadcastReceiver使用起來非常簡單,我們只需要先自定義一個廣播接收器,然后在想要接收廣播的組件中注冊該廣播接收器。當別的組件發送廣播的時候,廣播接收器就能收到該廣播,然后執行相應的操作就可以了。下面將一步步介紹廣播接收器的具體使用方法。

1.自定義廣播接收器:

? ? ? 自定義廣播接收器的方法很簡單,我們只需要創建一個自定義類繼承BroadcastReceiver,并實現onReceive()方法

public class MyBroadcastReceiver extends BroadcastReceiver {//需要實現的方法
    @Overridepublic void onReceive(Context context, Intent intent) {}
}

? ? ? onReceive()方法就是當廣播接收器接收到廣播后會執行的方法,我們可以看到它會接收到一個Intent,這個Intent就是發送廣播時傳過來的Intent對象,我們可以在onReceive()中獲取Intent傳來的額外數據,并進行處理。

2.注冊廣播接收器

? ? ? 創建了自己的廣播接收器后,我們就可以在需要接收廣播的地方進行注冊。注冊廣播的方式有兩種:靜態注冊和動態注冊。

? ? ? 靜態注冊廣播需要我們在AndroidManifest中去注冊廣播接收器,它的特點是該廣播接收器一旦注冊后將會一直存在,并且監聽廣播,即使我們退出了應用,廣播接收器仍然可以接收廣播,并觸發onReceive()方法。靜態廣播的使用也比較廣泛,比如一個公司里有多個App產品,通過靜態注冊的廣播接收器,就能夠實現一個App啟動其他的App。

    <application>   ...<receiver android:name=".widget.MyBroadcastReceiver"><intent-filter><action android:name="com.weimore.example.MY_BROADCAST"/></intent-filter></receiver>...<application/>

? ? ? 如上,我們注冊廣播接收器,首先指定是哪一個廣播接收器,在receiver標簽寫上我們之前自定義的廣播接收器的類名即可。然后在里面添加一個intent-filter(過濾器)用來過濾廣播,intent-filter里的action指定了我們所要接收的廣播,如果對intent-filter不了解的,可以去看看我寫的關于intent的一篇博客。當其他地方發出廣播時,我們會對比其傳遞的intent中的action,如果intent中的action與注冊廣播接收器時intent-filter中指定的action一致,則接收此廣播,這樣就起到了廣播過濾的作用。

? ? ? 動態注冊廣播和靜態注冊一樣,需要知道使用的廣播接收器,以及需要一個Intent-filter用來過濾廣播,Intent-filter中同樣需要傳入一個action,用來指定要接收的廣播,最后使用registerReceiver()注冊廣播即可。代碼如下:

   //自定義的廣播接收器
MyBroadcastReceiver mReceiver = new MyBroadcastReceiver();//過濾器,其中傳入一個action
IntentFilter filter
= new IntentFilter("com.weimore.example.MY_BROADCAST");//注冊廣播
registerReceiver(mReceiver,filter);

? ? ? ?解注冊廣播:

   //解注冊
unregisterReceiver(mReceiver);

? ? ? 我們用Activity動態注冊和解注冊BraodcastReceiver時,最好在onResume()方法和onPause()方法中進行注冊和解注冊。因為不處于交互狀態的Activity本來就沒有必要去接受和處理廣播。

? ? ? 這樣廣播接收器就算是注冊完成了,接下來只要等待其他應用或組件發送廣播。然后進行接收就可以了。發送廣播的方法也很簡單,通過調用sendBroadcast()方法,并傳入一個 intent 即可。

  //創建Intent對象Intent intent = new Intent();//指定actionintent.setAction("com.weimore.example.MY_BROADCAST");//發送廣播sendBroadcast(intent);

? ? ? 廣播發送后,我們注冊的廣播接收器就能接收到廣播,并調用接收器中的onReceive()方法,整個廣播的發送與接收流程也就完成了。要注意的是,靜態注冊廣播接收器的特點是即使應用銷毀后也會接收廣播,而動態注冊廣播接收器則相反,它的生命周期十分短暫,大概在10秒左右。每次當有匹配的廣播發送過來時,它會創建BroadcastReceiver,并執行里面的onReceive()方法,然后10秒左右就會被銷毀,所以我們在onReceive()方法種盡量不要進行太長的耗時操作。此外,我們也最好不要再BroadcastReceiver中創建子線程進行耗時操作,因為BroadcastReceiver在執行onReceive()結束任務后,它的進程優先級會處于空進程的優先級,隨時隨地會被系統給回收銷毀,而依賴于該進程的子線程也會隨即被銷毀。所以最好的處理方法是在onReceive()中啟動Service,將耗時操作交給Service去處理。

?

其他的Broadcast

? ? ??上面所介紹的廣播屬于標準廣播,該種廣播一旦發送,只要是action能夠匹配的BroadcastReceiver都能夠接收到廣播。除了該類型的廣播之外,我們還能夠發送有序廣播,本地廣播等。

? ? ? 有序廣播是指當廣播發送后,會根據廣播接收器的優先級進行順序傳遞。比如有兩個廣播接收器都能夠匹配該廣播,但一個的優先級為100,而另外一個的優先級為50,則廣播為先傳遞到優先級高的那個廣播接收器,該廣播接收器接收到廣播后,可以對廣播進行攔截,這樣后面的廣播接收器就無法接收到該廣播了,如果不做攔截,則會繼續按優先級大小發送廣播。

? ? ? 有序廣播的使用也很簡單,將之前的sendBroadcast()方法變為sendOrderedBroadcast()就可以了。

//第二個參數表示接收器接收該廣播所需要的權限,一般傳null即可
sendOrderedBroadcast(intent,null);

? ? ? 設置廣播接收器的優先級主要是在Intent-filter中設置的。靜態注冊和動態注冊給廣播接收器設置優先級的方法分別如下:

   //靜態注冊
<receiver android:name=".widget.MyBroadcastReceiver"><intent-filter android:priority="100"> //設置優先級<action android:name="com.weimore.example.MY_BROADCAST"/></intent-filter></receiver>
   //動態注冊   
IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");filter.setPriority(100);

? ? ? 如果某個廣播接收器想要攔截該廣播,只需要在onReceive()方法中調用abortBroadcast()方法就可以了。

@Overridepublic void onReceive(Context context, Intent intent) {//攔截廣播
        abortBroadcast();}

? ? ?

? ? ? 本地廣播和標準廣播以及有序廣播有些許不同,它是使用LocalBroadcastManager來發送廣播以及注冊廣播接收器的。本地廣播的優點是它發出的廣播只會在應用程序的內部傳播,不用擔心廣播被其他應用接收,造成數據泄漏,而廣播接收器也只能接收到自己應用發出的廣播,不會接收別的應用發來的廣播,防止接收垃圾信息。具體使用如下:

    //得到LocalBroadcastManager實例LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);mReceiver = new MyBroadcastReceiver();IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");//注冊廣播接收器manager.registerReceiver(mReceiver,filter);
    //得到LocalBroadcastManager實例LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);Intent intent = new Intent();intent.setAction("com.weimore.example.MY_BROADCAST");//發送本地廣播manager.sendBroadcast(intent);

? ? ??

?

轉載于:https://www.cnblogs.com/weimore/p/7858640.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql數據庫索引頁號為什么從3開始_MySQL數據庫快問快答

原標題&#xff1a;MySQL數據庫快問快答前言今天樓主給大家列一下關于數據庫幾個常見問題的要點&#xff0c;如果大家對其中的問題感興趣&#xff0c;可以自行擴展研究。1. UNION ALL 與 UNION 的區別UNION和UNION ALL關鍵字都是將兩個結果集合并為一個。UNION在進行表鏈接后會…

通過簡單的Spring方面擺脫null參數

什么是世界上最令人討厭的&#xff0c;同時也是最受歡迎的例外&#xff1f; 我敢打賭這是NullPointerException。 NullPointerException可以表示任何東西&#xff0c;從簡單的“ ups&#xff0c;我認為不能為空”到數小時和數天的第三方庫調試&#xff08;我敢于嘗試使用Doze…

java arraylist排序_最全Java集合筆記

集合概述什么是集合集合框架&#xff1a;用于存儲數據的容器。集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容&#xff1a;對外的接口、接口的實現和對集合運算的算法。接口&#xff1a;表示集合的抽象數據類型。接口允許我們操作…

【3】JVM-OutOfMemory異常重現

JVM中常見的OOM&#xff0c;那么如何通過自己編寫代碼產生這些OOM異常呢&#xff1f;通過寫代碼重現異常&#xff0c;是為了避免在工作中寫出有OOM BUG的代碼。之前雖然看過相關文章&#xff0c;但是沒自己寫過這些代碼&#xff0c;這次在編寫的實際過程中&#xff0c;由于和書…

CachedIntrospectionResults 初始化

轉載于:https://www.cnblogs.com/xiluhua/p/7862985.html

為什么有些內聯(行內)元素可以設置寬高?

為什么有些內聯&#xff08;行內&#xff09;元素如img、input可以設置寬高&#xff1f; 在說明之前我們先來了解一些定義。 塊級元素和內聯元素&#xff1a; ①塊級元素總是獨占一行&#xff0c;表現為另起一行開始&#xff0c;而且其后的元素也必須另起一行顯示。 寬度(w…

mongo數據庫和mysql數據庫的區別_Mongodb與mysql數據庫的區別

MySQLMongoDB說明mysqldmongod服務器守護進程mysqlmongo客戶端工具mysqldumpmongodump邏輯備份工具mysqlmongorestore邏輯恢復工具db.repairDatabase()修復數據庫mysqldumpmongoexport數據導出工具sourcemongoimport數據導入工具grant * privileges on *.* to …Db.addUser()Db…

在Eclipse中高效運行HTTP / REST集成測試

最近&#xff0c;我有機會使用由我親愛的Holger Staudacher編寫的OSGi-JAX-RS-Connector庫。 通過連接器&#xff0c;您可以通過將Path注釋的類型注冊為OSGi服務來輕松發布資源-實際上&#xff0c;它工作得很好。 對于我來說&#xff0c;使用普通的JUnit測試編寫驅動的服務類測…

Eclipse安裝TestNG插件

Eclipse安裝TestNG插件 TestNG是什么? TestNG按照其文檔的定義是&#xff1a; TestNG是一個測試框架&#xff0c;其靈感來自JUnit和NUnit的&#xff0c;但引入了一些新的功能&#xff0c;使其功能更強大&#xff0c;使用更方便。 TestNG是一個開源自動化測試框架;TestNG表示下…

basicdatasourcefactory mysql_Java基礎-DBCP連接池(BasicDataSource類)詳解

Java基礎-DBCP連接池(BasicDataSource類)詳解作者&#xff1a;尹正杰版權聲明&#xff1a;原創作品&#xff0c;謝絕轉載&#xff01;否則將追究法律責任。實際開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程&#xff0c;為了解決此類性能問題&#xff0c;通常…

生物神經網絡衍生出的算法

一個生物神經網絡的基本結構&#xff1a; 生物神經網絡由大量神經元組成&#xff0c;這些神經元之間通過突觸相互連接。神經元可以接收來自其他神經元的信號&#xff0c;并根據信號的強度和類型來調整自己的輸出信號。這種神經元之間的相互連接和信號傳遞形成了生物神經網絡的基…

echart實例數據 本地加載_JVM 類加載概述

來源&#xff1a;SegmentFault 思否社區作者&#xff1a;又壞又迷人JVM簡介JVM是Java Virtual Machine(Java虛擬機)的縮寫&#xff0c;JVM是一種用于計算設備的規范&#xff0c;它是一個虛構出來的計算機&#xff0c;是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Ja…

JPA / Hibernate:基于版本的樂觀并發控制

本文是Hibernate和JPA中基于版本的樂觀并發控制的簡介。 這個概念已經很老了&#xff0c;上面已經寫了很多東西&#xff0c;但是無論如何我都看到了它被重新發明&#xff0c;誤解和濫用。 我在編寫它只是為了傳播知識&#xff0c;并希望引起人們對并發控制和鎖定的興趣。 用例…

高可用集群搭建

高可用集群搭建  創建hadoop賬戶 創建hadoop賬戶&#xff08;#注意&#xff0c;接下來的操作均在hadoop賬戶下運行&#xff09; # useradd hadoop # passwd hadoopsu - hadoopmkdir soft disk1 disk2mkdir -p disk{1,2}/dfs/{dn,nn}mkdir -p disk{1,2}/nodemgr/local 將本地目…

scrt如何切換成英文版_英文版SecureCRT顯示亂碼解決

英文版SecureCRT顯示亂碼解決系統環境&#xff1a;CentOS&#xff15;.&#xff16;以前Linux都是默認安裝在英文環境下&#xff0c;用英文版的SecureCRT查看系統內容輸出的也都是英文的&#xff0c;不會出現亂碼問題。今天同事在服務器安裝時默認選擇了簡體中文&#xff0c;這…

java try catch_Java捕獲異常

大家好&#xff0c;歡迎來到樂字節小樂的Java技術分享園地在Java中&#xff0c;凡是可能拋出異常的語句&#xff0c;都可以用try ... catch捕獲。把可能發生異常的語句放在try { ... }中&#xff0c;然后使用catch捕獲對應的Exception及其子類。多catch語句可以使用多個catch語…

haproxy文件操作

import os #導入os模塊def search(): #定義查找函數 with open(haproxy.txt,r) as f: #只讀方式打開文件 value input(請輸入您…

多語言持久性:帶有MongoDB和Derby的EclipseLink

從現在開始&#xff0c;多語種持久性一直是新聞。 從2011年底開始&#xff0c;在著名的Fowler帖子的推動下&#xff0c;我看到了更多更好的主意。 最新的一個是公司內部的學生項目&#xff0c;我們在其中使用Scala作為后端數據&#xff0c;將數據持久存儲到MongoDB&#xff0c;…

web前端開發最佳實踐--(筆記之JavaScript最佳實踐)

如何避免全局變量污染&#xff1f; 避免定義全局變量或全局函數用一個變量進行封裝&#xff0c;并返回外部需要訪問的接口如何寫出高維護的js代碼 配置數據和代碼邏輯分離 如&#xff1a; 改成&#xff1a; ---用js模板mustachehandlebarsjsMVC的數據模式 model&#xff1a;數據…

yum mysql5.7位置_CentOS yum 安裝 Mysql5.7

1 Steps for a Fresh Installation of MySQL# wget https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm# yum localinstall mysql57-community-release-el6-9.noarch.rpm以上步驟其實是把 MySQL Yum repository 添加到了系統的 repository list 里去了。ll…