廣播接收器可以自由地對自己感興趣的廣播進行註冊,這樣當有相應的廣播發出時,廣播接收器就能夠收到該廣播,並在內部處理相應的邏輯。註冊廣播的方式一般有兩種,在代碼中註冊和在AndroidManifest.xml 中註冊,其中前者也被稱爲動態註冊,後者也被稱爲靜態註冊。
(1)動態註冊監聽網絡變化
1、新建類繼承自BroadcastReceiver,並重寫onReceive()方法
2、創建了一個IntentFilter的實例,並給它添加了action
3、創建了一個新建類的實例
4、將IntentFilter的實例、新建類的實例都傳了進去registerReceiver
5、調用unregisterReceiver()方法取消註冊
6、配置文件中聲明權限
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;
/**
* 動態註冊監聽網絡變化
* 步驟1-6
*/
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 2、創建了一個IntentFilter的實例,並給它添加了
* 一個值爲android.net.conn.CONNECTIVITY_CHANGE 的action;
* 爲什麼要添加這個值呢?
* 因爲當網絡狀態發生變化時, 系統發出的正是一條值爲android.net.conn.CONNECTIVITY_CHANGE的廣播
* 也就是說我們的廣播接收器想要監聽什麼廣播,就在這裏添加相應的action
*/
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//3、創建了一個NetworkChangeReceiver 的實例
networkChangeReceiver = new NetworkChangeReceiver();
//4、將NetworkChangeReceiver 的實例和IntentFilter 的實例都傳了進去
registerReceiver(networkChangeReceiver, intentFilter);
}
/**
* 1、內部類繼承自BroadcastReceiver,並重寫onReceive()方法
* 每當網絡狀態發生變化時,onReceive()方法就會得到執行
*
*/
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//先通過getSystemService()方法得到了ConnectivityManager的實例
//這是一個系統服務類,專門用於管理網絡連接的
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//調用它的getActiveNetworkInfo()方法可以得到NetworkInfo 的實例
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
//接着調用NetworkInfo 的isAvailable()方法,就可以判斷出當前是否有網絡了
if (networkInfo !=null&&networkInfo.isAvailable()) {
Toast.makeText(context, "network is available",
Toast.LENGTH_LONG).show();
}else {
Toast.makeText(context, "network is unavailable",
Toast.LENGTH_LONG).show();
}
}
}
/**
* 5、動態註冊的廣播接收器一定都要取消註冊才行
* 這裏我們是在onDestroy()方法中通過調用unregisterReceiver()方法來實現的。
*/
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
/**
* 6、Android系統爲了保證應用程序的安全性做了規定,如果程序需要訪問一些系統的關鍵性信息,必須在配置文件中聲明權限纔可以,否則
* 程序將會直接崩潰, 比如這裏查詢系統的網絡狀態就是需要聲明權限的。打開AndroidManifest.xml 文件,
* 在裏面加入如下權限就可以查詢系統網絡狀態了:
* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*/
}
(2)靜態註冊實現開機啓動
動態註冊的廣播接收器可以自由地控制註冊與註銷,在靈活性方面有很大的優勢,但是必須要在程序啓動之後才能接收到廣播,因爲註冊的邏輯是寫在onCreate()方法中的。那麼有沒有什麼辦法可以讓程序在未啓動的情況下就能接收到廣播呢?這就需要使用靜態註冊的方式了。
靜態註冊使用步驟
1、新建類繼承自BroadcastReceiver,並重寫onReceive()方法
2、AndroidManifest.xml中標籤,所有靜態註冊的廣播接收器都是在這裏進行註冊的
3、通過android:name來指定具體註冊哪一個廣播接收器,
4、標籤里加入想要接收的廣播就行了,由於Android 系統啓動完成後會發出一條值爲android.intent.action.BOOT_COMPLETED的廣播,因此我們在這裏添加了相應的action。
5、監聽系統開機廣播也是需要聲明權限的
/**
* 1、新建一個BootCompleteReceiver 繼承自BroadcastReceiver
*/
public class BootCompleteReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
/**
* 2、AndroidManifest.xml 中將這個廣播接收器的類名註冊進去
*/
//監聽系統開機廣播也是需要聲明權限的
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
//通過android:name來指定具體註冊哪一個廣播接收器
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
(3)注意事項
不要在onReceive()方法中添加過多的邏輯或者進行任何的耗時操作,因爲在廣播接收器中是不允許開啓線程的,當onReceive()方法運行了較長時間而沒有結束時,程序就會報錯。因此廣播接收器更多的是扮演一種打開程序其他組件的角色,比如創建一條狀態欄通知,或者啓動一個服務等。