Android廣播接收器(一)

廣播的種類

1.標準廣播
標準廣播是一種完全異步執行的廣播,在廣播發出之后,所有的廣播接收器幾乎會同時接收到這條廣播消息。此類廣播效率較高而且不能截斷。


2.有序廣播
有序廣播是一種同步執行的廣播,廣播發出之后,優先級高的廣播接收器就可以先接收到廣播消息,執行完該廣播接收器的邏輯后,可以選擇截斷正在傳遞的廣播或者繼續傳遞,如果廣播消息被截斷,之后的廣播接收器則無法收到廣播消息。

接收系統廣播

注冊廣播的方式一般有兩種,在代碼中注冊稱為動態注冊;在AndroidManifest.xml中注冊稱為靜態注冊。

1.動態注冊廣播接收器

下面是通過一個監聽網絡變化的demo來學習廣播接收器的動態注冊。
首先需要新建一個類,繼承BroadcastReceiver并復寫父類的onReceive()方法就行了。當有廣播到來時,onReceiver()方法就會得到執行。

public class MainActivity extends AppCompatActivity { 

  private IntentFilter intentFilter; 
  private NetworkChangeReceiver networkChangeReceiver; 

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

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

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

  class NetworkChangeReceiver extends BroadcastReceiver {

    @Override 
    public void onReceive(Context context, Intent intent) {

      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 

      if (networkInfo != null && networkInfo.isAvailable()) { 
        Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show(); 
      } else { 
        Toast.makeText(context, "network is unavailbale", Toast.LENGTH_SHORT).show(); 
      } 
    }
  }

}

在MainActivity中定義了一個內部類NetworkChangeReceiver繼承自BroadcastReceiver,并復寫父類的onReceive()方法。每當網絡狀態發生變化時,onReceive()方法就會得到執行。在onReceive()方法中,首先通過getSystemService()方法得到ConnectivityManager的實例,這是一個系統服務類,專門用于管理網絡連接的。再調用它的getActiveNetworkInfo()方法得到NetworkInfo的實例,接著調用NetworkInfo的isAvailable()方法就可以判斷出當前是否有網絡了。

在onCreate()方法中,首先創建了一個IntentFilter的實例,并添加一個值為android.net.conn.CONNECTIVITY_CHANGE的action。

想要監聽什么廣播,只需要在這里添加相應的action

接下來創建一個NetworkChangeReceiver實例,最后調用registerReceiver()方法進行注冊,將NetworkChangeReceiver和IntentFilter作為參數進去,這樣就可以實現了監聽網絡變化的功能。這種方法就稱為動態注冊廣播接收器。

需要注意的是:
動態注冊廣播接收器一定都要取消注冊。在onDestroy()方法中調用unregisterReceiver()方法就可以實現取消注冊了。

最后不要忘了讀取網絡狀態需要添加讀取網絡狀態的權限

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

2.靜態注冊廣播接收器

動態注冊的廣播接收器可以自由地控制注冊于注銷,在靈活性方面有很大的優勢,但是它必須要在程序啟動之后才能接收到廣播,因為注冊的代碼是寫在onCreate()方法中的。如果需要在程序未啟動的情況下就能接收到廣播就需要用到靜態注冊的方法了。下面是通過靜態注冊廣播接收器的方法來實現對開機廣播的接收。

  • 首先新建一個BootCompleteReceiver類繼承BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver {
 
  @Override 
  public void onReceive(Context context, Intent intent) {
     Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();  
  }
}
  • 接下來需要在AndroidManifest.xml聲明BootCompleteReceiver這個類,BroadcastReceiver是安卓的四大組件之一,所以以下代碼需要寫在<application>標簽內
<receiver android:name=".BootCompleteReceiver">
    <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/>   
    </intent-filter>
</receiver>
  • 監聽系統開機廣播同樣需要聲明權限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

這樣就可以實現廣播的靜態注冊了。

這篇文章就先到這里,下一篇文章Android廣播接收器(二)將介紹如何來發送自定義廣播。由于本人水平有限,如有錯誤,歡迎大家指正。共同學習進步!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 現實中的廣播:電臺為了傳達一些消息而發送廣播,通過廣播攜帶要傳達的消息,群眾只要買一個收音機,就可以收到廣播了。 ...
    stevewang閱讀 4,296評論 0 8
  • 廣播接收器 是Android的四大組件之一,可見廣播在Android中的重要性; 1. 什么是廣播? 廣播(Bro...
    Lost_Robot閱讀 1,977評論 2 10
  • 前言 本來想寫一下廣播的,發現查閱后有整理的不錯的,只好轉載圖個簡便,日后好復習轉載:http://www.cnb...
    提升即效率閱讀 1,404評論 0 10
  • 諸多無奈,最近在改一個項目的bug的時候,腦子老是一片空白,可能是最近腦子不夠用,總之,好多東西忘了,閱讀一些別人...
    狗子王1948閱讀 7,742評論 6 53
  • 作者/胄寧 半空的床上印著一痕寂寞, 我睜著眼睛細數枯黃的葉落, 葉子落滿了空空的亭閣, 蓋下一片陰暗抑郁的陰影,...
    胄寧閱讀 258評論 0 1