广播主要分为两种:标准广播有序广播。

标准广播:异步执行的 广播,广播发出后所有的广播接收器都在同一时间接收到这条广播信息。。

img

有序广播:同步执行的广播,广播接收器具有优先级。同时可以截断广播。

img

接受系统广播

注册广播的方式也有有两种:在代码中注册和在AndroidMainFest.xml文件中注册。前者为动态注册后者为静态注册

  • 动态注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceive networkChangeReceive;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter(); //创建Intent实例
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");// 监听android.net.conn.CONNECTIVITY_CHANGE广播
networkChangeReceive = new NetworkChangeReceive();
registerReceiver(networkChangeReceive,intentFilter);// 注册广播
}


//动态注册的广播接收器一定要取消注册。
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceive);
}

class NetworkChangeReceive extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager systemService = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = systemService.getActiveNetworkInfo(); // 注意在AndroidMainfest.xml文件中注册权限信息。
if (info != null && info.isAvailable()) {
Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();

}
}
}
}

- 实例化自定义的广播接收器。

- 创建IntentFilter实例。

- 调用IntentFilter实例的addAction()方法添加监听的广播类型。

- 最后调用Context的registerReceiver(BroadcastReceiver,IntentFilter)动态的注册广播。

注册权限信息:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  • 静态注册实现开机启动
1
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

本地广播

全局广播很容易引起安全性问题,为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在应用程序内部传递,并且广播接收器也只能接收来自本应用程序发出的广播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*通过点击Button发送本地广播*/
public class BroadcastActivity extends AppCompatActivity {

private static final String TAG = "TAG";//标签
private LocalBroadcast localBroadcast; //本地广播
private Button mBtStart;//Button按钮

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast);
mBtStart = findViewById(R.id.bt_start);
mBtStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LocalBroadcastManager.getInstance(BroadcastActivity.this).sendBroadcast(new Intent("com.hbbfxy.localbroadcast"));//发送本地广播
}
});
/*注册广播*/
localBroadcast = new LocalBroadcast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.hbbfxy.localbroadcast");
LocalBroadcastManager.getInstance(this).registerReceiver(localBroadcast, intentFilter);

}

private class LocalBroadcast extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "onReceive: " );
}
}

@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(localBroadcast);//接触注册广播
}
}

注意在广播接收器中启动活动时需要给Intent添加FLAG_ACTIVITY_NEW_TASK标志。对话框中也需要添加TYPE_SYSTEM_ALERT否则可能会显示失败。