Android 入门(6)-广播详解与实战
广播
一听见这个名字就能想到,小的时候走街串巷的大喇叭,学校里做操上课的铃声,一个个大喇叭中传播着我们的青春,广播从小就深入人心。Android广播也不例外,当你的一个活动在行进过程中,需要告诉别的活动一个比较重要的信息,例如你在登陆简书网app的时候需要用到qq,那么通知qq的这个过程其实也是广播,你的后台清理程序一件关闭所有后台程序其实也是广播,广播在Android中非常常用,所以,我们有必要掌握这种实用又方便的工具。
广播分为标准广播与有序广播
标准广播
广播接收器同时收到广播
标准广播
有序广播
广播按顺序传递,任意节点可截断广播的传递
有序广播
广播的实现
广播的实现又两种方式,一种是动态创建广播接收器,一种是静态写入广播接收器,第二种开机启动,第一种静态创建
现在通过一个小的项目来进行一下讲解
1.动态创建广播接收器
首先创建一个新的项目,命名为BoardCast_1,其他全部默认。
这个小项目需要实现的功能是实现一个广播接收器,能够监测到网络的连接状态。
首先进入到MainActivity.java 文件中,我们需要动态注册一个广播接收类,用于接收我们的网络状态广播。首先实现内部类NetworkChangeReceiver
class NetWorkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isAvailable()){
Toast.makeText(context,"network is avaliable",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
}
}
}
广播接收类就实现了一个功能,那就是当网络发生变化的时候弹出信息,提示我们网络状态发生变化即可。
这里我们使用了ConnectivityManager监测当前网络状况
接下来我们需要创建一个广播管理者,让广播管理者与我们的广播实例绑定起来,并且在活动销毁的时候结束绑定。这些我们依然是在MainActivity类中实现。
我们在OnCreate
中实现绑定,在OnDestory
中实现解绑
IntentFilter intentFilter;
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);
}
android.net.conn.CONNECTIVITY_CHANGE
是系统自带的网络变化事件
点击运行,按home键退出,当我们在设置中开启飞行模式的时候能够看到提示,打开的时候也可以看到提示,即我们第一个小项目完成。
关闭网络 打开网络
静态创建广播接收器
静态创建广播接收器,通过IDE创建独立的广播接收器,在属性页上设置对应的权限与声明,即可实现静态创建。
1右键包,创建新的Receiver
创建新的Receiver创建名为BootCompleteReceiver的广播接收器
广播接收器
然后实现OnReceive函数
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"you open the mobile phone",Toast.LENGTH_SHORT).show();
}
最后打开AndroidMainifest.xml文件进行权限许可与广播接收的类型声明
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
监听开机广播权限声明
-----------------------
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>监听开机广播
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
这样当下次开机的时候就会显示信息“you open the mobile phone”
发送广播
发送广播同样又两种形式,发送标准广播与发送有序广播,发送标准广播的函数为
sendBroadcast(Intent intent)
,发送有序广播的函数为sendOrderBroadcast(Intent intent,权限控制(可以为null))
上部分我们知道了可以在AndroidMainifest.xml中给接收器声明接收的广播类型,我们在有序广播中的OnReceive中调用abortBroadcast就可以实现截断广播。
发送本地广播
在一般的动态广播接收器中,申明一个新的类型LocalBroadcastManager,通过这个类型管理绑定本地广播与本地接收器,广播就不会被非本程序的程序恶意监听
声明
LocalBroadcastManager localBroadcastManager;
新建
localBroadcastManager = new LocalBroadcastManager.getInstence(this);
绑定
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
解绑
localBroadcastManager.unregisterReceiver(localReceiver)