使用廣播-BroadcastReceiver最詳細解析

weixin_33872660發表於2018-07-31
11158618-fa949df44625e3df.jpg
標題圖
  • 女孩:BroadcastReceiver是什麼呀?
  • 男孩:Broadcast是廣播的意思,在Android中應用程式之間的傳輸資訊的機制,BroadcastReceiver是接收廣播通知的元件,廣播和廣播接收器是Android中需要了解的,那麼怎麼樣去了解呢~

廣播,大家應該可以理解,我們在學校做眼保健操時,就有個廣播,告訴我們要做眼保健操了。廣播傳遞資訊告訴我們要做什麼,通知資訊或傳遞資料等。廣播接收器是用來接收來自系統和應用的廣播。

在Android中提供了兩種主要的型別廣播:標準廣播和有序廣播。

什麼是廣播呢?在手機的訊息提示框,對話方塊或通知的形式告訴我們,如我們手機沒電了,會彈出提示,接收簡訊彈出提示等。而Broadcast Receiver為廣播接收器,是接收廣播的元件。

  • 女孩:那麼哥,什麼是普通廣播和有序廣播?
  • 男孩:額,在這裡你要了解一下普通廣播和有序廣播,主要講一下。~

普通廣播:

Normal broadcasts,是一種完全非同步執行的廣播,當廣播發出後,幾乎所有廣播接收器都會在同一時間收到這條廣播。如下圖:

11158618-0ee8a84459882a43.png
圖片

這相當於有人在廣播室裡,播放做眼保健操的資訊,一同發出到每個教室一樣,沒有先後順序之分,對於普通廣播是無法終止廣播的傳播,一旦傳送,無法截斷其中一條,幾乎被所有接受者收到,而我們做眼保健操的就是接受者了。對於普通廣播,在Android中使用Context.sendBroadcast()方法來傳送。

有序廣播:

有序廣播,Ordered broadcasts,是一種同步執行的廣播,廣播發出後,只會有一個廣播接收器能接收到廣播訊息,當這個廣播接收器接收到後,廣播才會繼承傳遞,對於有序廣播有了先後順序,在Android中提供了優先順序的屬性(priority)來控制先後,有序廣播中可以截斷廣播,不被下一個廣播接收器接收,這是有序廣播的特點。

11158618-2008fff627843cb5.png
圖片

在這裡你瞭解了普通廣播和有序廣播的原理,這兩種其實就是廣播的接收的不同表現形式而已。

BroadcastReceiver的實現:

到頭來還是要了解BroadcastReceiver的實現,接下來我列出主要的內容目錄,對於廣播接收器是我們要掌握的,是Android中重要的四大元件之一。

11158618-c1b9c46436af0267.png
BroadcastReceiver.png

接收系統廣播

你或許會問一下什麼又是系統廣播,對於掌握手機概念的,應用懂得系統,如:電池電量低,傳送系統廣播訊息;安裝新應用,廣播安裝資訊等。

廣播註冊分動態和靜態兩種:

動態註冊,需要繼承BroadcastReceiver的,並重寫onCreate()方法,和onReceive()方法,在onReceive()方法中,要例項接收器和IntentFilter例項。接著繼續重寫onDestroy()方法,加入unregisterReceiver()方法來實現取消註冊。

在動態註冊的廣播接收器中最後一定要取消註冊。

簡化:

重寫onCreate()
重寫onDestroy()
extends BroadcastReceiver
重寫onReceive()

靜態註冊,只要在配置檔案中修改程式碼即可,在AndroidManifest.xml檔案中:

<receiver android:name=包名.類名>
<intent-filter>
 <action android:name="傳送的廣播"
</intent-filter>
</receiver>

這裡補充說一個自定義的廣播接受者

步驟:同樣

  1. 繼承BroadcastReceiver基類
  2. 複寫抽象方法onReceive()方法

以上為傳送普通廣播的實現形式,那麼你還記得一個有序廣播嗎?對於有序廣播的形式很簡單,也是和普通廣播一樣實現。只在傳送有差異而已。

有序廣播和普通廣播差異:只要修改普通廣播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可,你會覺得難記嗎?

廣播接收器(Broadcast Reveiver)
標準廣播(Normal broadcasts)
有序廣播(Ordered broadcasts)

這裡說一下,我把標準廣播說錯成標準廣播了,其實這裡標準和普通隨意叫吧,不過為了顯示技術牛逼,在外人前儘量說標準廣播吧。ok?

使用本地廣播:

什麼又是本地廣播呢?你會問道,本地廣播是Android引入的一套機制,為本地廣播機制,使用本地廣播機制,有很多優點:

  1. 不用但系機密資料被洩漏;
  2. 不用擔心安全漏洞的隱患;
  3. 更加高效。

在介紹本地廣播之前,前面講的廣播室一種全域性的,屬於系統全域性廣播,廣播室一個全域性的監聽器,在Android中,我們要知道廣播有兩種說法:廣播傳送者和廣播接收者。

在本地廣播重點說明:本地廣播沒有靜態註冊的方式,靜態註冊是為了程式在未啟動前也能收到廣播,而傳送本地廣播時,我們的程式是已開啟了的。

  • 女孩:哥,講的差不多了,已經掌握了,不過可以寫一些程式碼例子嗎?
  • 男孩:嗯,可以,掌握就牛逼了~

程式碼示例:

// 繼承BroadcastReceivre基類
public class MyBroadcastReceiver extends BroadcastReceiver {

 // 複寫onReceive()方法
 @Override
 public void onReceive(Context context, Intent intent) {
  //寫入接收廣播後的操作
 }
}

示例動態註冊:

 private IntentFilter intentFilter;
 private MyReceiver myReceiver;

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  intentFilter = new IntentFilter();
  intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  myReceiver = new MyReceiver();
  registerReceiver(myReceiver, intentFilter);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();

  unregisterReceiver(myReceiver);
  
 }

示例靜態註冊:

<receiver android:name=".包名" >
  <intent-filter>
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>

最後都要加許可權:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

傳送自定義廣播:

Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要傳送的廣播值
sendBroadcast(intent);

傳送有序廣播:

//sendOrderedBroadcast()方法
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要傳送的廣播值
sendOrderBroadcast(intent,null);
<intent-filter android:priority="100">
...
</intent-filter>
//優先順序

abortBroadcast();
//截斷

本地廣播:

localBroadcastManager = LocalBroadcastManager.getInstance(this);
//獲取例項

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.....");
myReceriver = new MyReceriver();
localBroadcastManager.registerReceiver(myReceriver, intentFilter);

Intent intent = new Intent("com...");
localBroadcastManager.sendBroadcast(intent);
//傳送本地廣播

localBroadcastManager.unregisterReceiver(myReceiver);

總結

有關內容就到這裡了,本篇介紹了四大元件中的廣播元件的知識點。

小禮物走一走 or 點贊

11158618-cf4a57245b051463
送心

相關文章