1. 广播概述
Broadcast就是应用间的全局大喇叭,即通信的一个手段。Android中每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序只会接收到自己关心的广播内容。这些广播可能来自系统,也可能来自其他应用程序。发送广播借助Intent,接收广播需要引入一个新的概念——广播接收器(Broadcast Receiver)。
BroadcastReceiver 是对发送出来的 Broadcast 进行过滤、接受和响应的组件。首先将要发送的消息和用于过滤的信息(Action,Category)装入一个 Intent 对象,然后通过调用Context.sendBroadcast()
、 sendOrderBroadcast()
方法把 Intent 对象以广播形式发送出去。 广播发送出去后,所以已注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则会调用 BroadcastReceiver 的 onReceiver()
方法
所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceiver()
方法。BroadcastReceiver 的生命周期很短,在执行 onReceiver() 方法时才有效,一旦执行完毕,该Receiver 的生命周期就结束了
1.1 广播类型
Android中广播主要分为两种类型:标准广播和有序广播。
2. 接收广播系统
android 内置了很多系统级别的广播,可以在应用程序中通过监听这些波光来得到各种系统的状态信息。想要接收这些广播,需要使用广播接收器。注册的方法又分为两种:动态与静态
2.1 动态注册(监听网络变化)
动态注册 BroadcastReceiver 是在代码中定义并设置好一个 IntentFilter
对象,然后在需要注册的地方调用 Context.registerReceiver()
方法,调用 Context.unregisterReceiver()
方法取消注册,此时就不需要在清单文件中注册 Receiver 了
创建一个广播接收器,只需要新建一个类,让它继承自BroadcastReceiver
,并重写父类的onReceive()
方法就可以。当有广播来,onReceive()
方法就会得到执行,具体逻辑可以再这个方法中处理。
示例:(监听网络变化)
- 修改MainActivity.java代码
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 connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
Toast.makeText(context, "network is Connected", Toast.LENGTH_SHORT).show(