一、分類
標準廣播
是一種完全非同步執行的廣播,在廣播發出後,所有的廣播接收器幾乎會在同一時刻接受到這條廣播訊息,沒有任何順序而言。這種廣播效率比較高,但是無法被截斷。
有序廣播
是一種同步執行的廣播,在廣播發出後,同一時刻只會有一個廣播接收器能夠收到這條廣播訊息,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳遞。顯而易見,這類廣播是有先後順序的,優先順序高的廣播接收器就可以先收到廣播訊息,並且前邊的廣播接收器可以截斷正在傳遞的廣播。
二、動態註冊接收系統廣播
就以監聽網路變化為例吧!
步驟
1、宣告網路許可權
<use-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2、建立一個類NetworkChangeReceiver繼承自BroadcastReceiver。
3、建立一個IntentFilter例項,併為其新增一個值為android.net.conn.CONNECTIVITY_CHANGE的action。
4、建立NetworkChangeReceiver的例項,然後呼叫registerReceiver()方法進行註冊,同時傳入NetworkChangeReceiver的例項和IntentFilter的例項。
5、最後不要忘記取消註冊廣播接收器(因為此廣播接收器為動態註冊的)。
程式碼
package com.henuajy.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
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) {
Toast.makeText(context,"network chages",Toast.LENGTH_SHORT).show();
}
}
}
三、靜態註冊接收系統廣播
仍然以監聽系統網路狀態為例
步驟
1、新建一個類NetworkChangeReceiver,繼承BroadcastReceiver並重寫onReceive()方法;
package com.henuajy.notificationtest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//網路狀態發生變化的邏輯
}
}
2、在配置檔案中的manifest標籤下宣告網路許可權;
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3、在配置檔案中的application標籤下新增receiver並新增action--“android.net.conn.CONNECTIVITY_CHANGE”;
<receiver
android:name=".NetworkStateReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
注意
Android系統為了保護使用者裝置的安全和隱私,做了嚴格的規定:如果程式需要進行一些對使用者來書比較敏感的操作,就必須在配置檔案中宣告許可權才可以,否則程式會直接崩潰。比如這裡訪問系統的網路狀態就是需要宣告許可權的。
小補充
如果想要判斷網路狀態是開啟還是關閉,可用下列方法:
1、通過getSystemService()【由於是關於網路狀態的,所以要傳入引數Context.CONNECTIVITY_SERVICE】方法獲取ConnectionManager類的例項manager;
2、通過呼叫manager的getActiveNetworkInfo()方法獲取NetworkInfo類的例項info;
3、通過info的isAvailable()【返回bool值】方法判斷網路是否可用。
ConnectionManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if(info!=null&&info.isAvailable()){
//網路可用的邏輯
}else{
//網路不可用的邏輯
}