廣播的種類
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廣播接收器(二)將介紹如何來發送自定義廣播。由于本人水平有限,如有錯誤,歡迎大家指正。共同學習進步!