Android广播机制
广播机制概述
记得在我上学的时候, 每个班级的教室里都会装有一个喇叭, 这些喇叭都是接入到学校的广播室的, 一旦有什么重要的通知, 就会播放一条广播来告知全校的师生。
为了便于进行系统级别的消息通知, Android也引入了一套类似的广播消息机制。 相比于我前面举出的两个例子, Android中的广播机制会显得更加灵活。
为什么说Android中的广播机制更加灵活呢? 这是因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册, 这样该程序就只会接收到自己所关心的广播内容, 这些广播可能是来自于系统的, 也可能是来自于其他应用程序的。 Android提供了一套完整的API, 允许应用程序自由地发送和接收广播。 发送广播的方法其实之前稍微提到过, 就是借助我们第2章学过的Intent。 而接收广播的方法则需要引入一个新的概念——广播接收器(Broadcast Receiver) 。
动态注册广播接收器示例
package com.example.administrator.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 changes", Toast.LENGTH_SHORT).show();
}
}
}Code language: JavaScript (javascript)
添加网络权限
AndroidManifest.xml文件, 在里面加入如下权限就可以访问系统网络状态了:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
</manifest>Code language: HTML, XML (xml)
运行测试说明
整体来说, 代码还是非常简单的, 现在运行一下程序。 首先你会在注册完成的时候收到一条广播, 然后按下Home键回到主界面(注意不能按Back键, 否则onDestroy() 方法会执行) , 接着打开Settings程序→Data usage进入到数据使用详情界面, 然后尝试着开关Cellular data按钮来启动和禁用网络, 你就会看到有Toast提醒你网络发生了变化。
