一、 廣播註冊
- 動態註冊 代碼中註冊。
- 靜態註冊 AndroidManifest.XML文件中註冊。
區別:
動態註冊在活動中添加一個內部類繼承自BroadcaseReceiver。
靜態註冊新建一個類繼承自BroadcastReceiver並且在AndroidManifest.XML文件中添加標籤。
1.1 動態註冊
動態監聽網絡變化
public class MainActivity extends AppCompatActivity{
private TestReceiver mTestReceiver;
@Override
protected void onCreate(Bundle savedInstaceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//創建一個過濾器來獲取需要監聽的內容
IntentFilter filter = new IntentFilter();
filter.addAction("");
//action不一定非要系統定義的aciton,也可以自己創建
//在onCreate內部有了一個內部類必須通過new 才能獲取,而由於TestReceiver繼承自BroadcastReceiver,父類有一個默認的無參構造來爲其創建
mTestReceiver = new TestReceiver();
regiseter(mTestReceiver, filter);
}
@Override
protected void onDestroy(){
unregister(mTestReceiver);
super.onDestroy();
}
//監聽網絡變化
class TestReceiver extends BroadCastReceiver{
@Override
public void onReceived(Context context, Intent intent){
//網絡變化需要由系統服務監聽,因此需要有一個系統服務類ConnectivityManager,專門用於管理網絡連接
//通過網絡變化管理器來獲取網絡信息,網絡變化的監聽需要獲取權限
//在對網絡信息進行處理
ConnectivityManager connectivity = getSystemService(Context.CONNECTIVITY_SERVICE);
Network networkInfo = connectivityManager.getActiveNetwork();
if (networkInfo != null) {
//
} else {
//
}
}
}
}
1.2靜態註冊
與動態註冊的區別:可以發現在動態監聽過程中,
1、需要通過IntentFilter 來獲取需要監聽的內容,在通過register註冊廣播,
2、在Acitivity內部創建內部類從而實現動態監聽。
而靜態註冊,則是將這個過程轉換:
IntentFilter放在於AndroidManifest.XML文件中的標籤中獲取,爲了安全起見,一般exported是設爲false。
<receiver
android:name=".TestReceiver"
//enabled表示是否啓用這個這個廣播接收器
android:enabled="true"
//exported表示是否允許這個廣播接收器接受本程序之外的廣播
android:exported="true">
<Intent-filter>
<action android:name=""/>
</Intent-filter>
</reveiver>
創建內部類的過程則是新建一個java類並繼承BroadcastReciver,並重寫onReceive從而實現靜態註冊。
通過AS快捷方式創建一個BroadcastReceive。
public class TestReceiver extends BroadCastReceiver{
//監聽網絡變化
@Override
public void onReceived(Context context, Intent intent){
//網絡變化需要由系統服務監聽,因此需要有一個系統服務類ConnectivityManager,專門用於管理網絡連接
//通過網絡變化管理器來獲取網絡信息,網絡變化的監聽需要獲取權限
//在對網絡信息進行處理
ConnectivityManager connectivity = getSystemService(Context.CONNECTIVITY_SERVICE);
Network networkInfo = connectivityManager.getActiveNetwork();
if (networkInfo != null) {
//
} else {
//
}
}
}
在你需要調用廣播的活動中,你需要
public class MainActivity extends AppCompatActivity{
private Button mBtnSendBroadcast;
@Override
protected void onCreate(Bundle savedInstaceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//若需要手動點擊發送廣播
mBtnSendBroadcast = findViewById(R.id.button);
mBtnSendBroadcast.setOnclickListener(new View.OnclickListener){
@Override
public void onClick(View v){
Intent intent = new Intent("");
sendBroadcast(intent);
}
}
}
}
並且使用靜態註冊還可以實現開機啓動,監聽系統開機廣播也是需要權限android.permission.RECEIVE_BOOT_COMPLETED。
注意:
不要在onReceive()方法中添加過多的邏輯或者任何耗時操作,因爲廣播接收器是不允許開啓線程。廣播接收器更多的是扮演一種 打開程序其他組件的角色,比如創建以條狀態欄通知,或者啓動一個服務等。
二、 自定義廣播
自定義廣播其實在前文已經有講過了,在動態註冊是我們通常會通過IntentFilter 來獲取我們需要的action,從而實現動態註冊,事實上,actionn並不一定非要是系統定義的action(使用系統定義的則是相應行爲發生改變時,獲取系統的行爲並監聽),當然,我們也可以自定義(如com.test.receiver),除了這個改變之外,其實自定義廣播和標準廣播的動態註冊過程無任何差異。
三、有序廣播
有序廣播的發送則是在自定義廣播的基礎上發送方式發生了改變,即sendBroadcast(intent)改爲了sendOrderedBroadcast(intent,null),其中這個函數中第二個參數則是於權限相關的字符串。並且設置了priority優先級。
<receiver
android:name=".TestReceiver"
android:enabled="true"
android:exported="true">
<Intent-filter android:prioirty="100">
<action android:name=""/>
</Intent-filter>
</reveiver>
因此在發送廣播時,由於接收了同一個action,但是由於設置了不同的優先級,所以會出現有序的狀態。從而得到了有序廣播。
四、本地廣播
前面發送的均是系統全局廣播,即發出的廣播可以背其他任何應用程序接收到,並且可以接收來自於其他任何應用的廣播,這樣很容易引起安全問題,如當發送一些攜帶關鍵性數據的廣播可能會被其他應用程序截取,或者其他應用程序向我們發送垃圾廣播。
而本地廣播值能夠在應用程序內部進行傳遞,並且廣播只能接收來自本應用程序發出的廣播,這樣就解決了安全問題。
本地廣播使用了一個LocalBroadcastManager來對廣播進行管理,並提供了廣播註冊與發送的方法。
public class MainActivity extends AppCompatActivity{
private TestReceiver mTestReceiver;
private TestReceiver mTestReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstaceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnSendBroadcast = findViewById(R.id.button);
mTestReceiver = new TestReceiver();
//LocalBroadcastManager的getInstance獲取一個實例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
mBtnSendBroadcast.setOnclickListener(new View.OnclickListener){
@Override
public void onClick(View v){
Intent intent = new Intent("");
localBroadcastManager.sendBroadcast(intent);
}
}
IntentFilter filter = new IntentFilter();
filter.addAction("");
mTestReceiver = new TestReceiver();
localBroadcastManager.regiseter(mTestReceiver, filter);
}
@Override
protected void onDestroy(){
localBroadcastManager.unregister(mTestReceiver);
super.onDestroy();
}
class TestReceiver extends BroadCastReceiver{
@Override
public void onReceived(Context context, Intent intent){
}
}
}
廣播的內容大致分爲以上幾種,在實際開發中,通常動態註冊使用的比較多,通常利用廣播的動態註冊來動態監聽某一個狀態的變化,因此靈活使用動態監聽至關重要。