BroadcastReceiver
1.广播实际开发应用
2.广播使用
3.广播的分类
3.广播的安全问题
上来要将的第一个部分是实际应用场景,为什么想到讲这个呢?最近做了点语音识别相关的东西,才发现大一的时候,学的大学物理和高数的重要性,当时学的时候也是为了应付考试,拿奖学金,采取高中的那种应试的方式去学习,老师也不会去讲这些知识的使用场景,所以学起来是很枯燥的,所谓的沉默时间成本误区吧,但是如果我们知道这件事情对我们的重要性,知道它在哪里会用到,我们学起来会更具有目的性。
广播实际开发应用
广播,作为一个95后来说,这对我来说是很陌生的东西了,但是多少也还是知道的,首先我们要有一个广播接收器,然后有广播站,我们将广播接收器调至不同的频道,我们就能够接收到相应广播站的广播。Android提供的也正是一套这样的机制。我们在应用中通过一个广播接收器来接受相应的系统级广播或者是自定义广播。
我们在使用微信的时候,当我们的网络出现了问题,这个时候,会有一个吐司给我们一个网络连接状况的提示,无论我们处在任何页面,我们都能够看到这个提示,这肯定不会是在每个activity中进行相应的逻辑处理,这就是通过广播来实现的,对系统级网络广播进行接受,接收到广播,然后对其进行分析,执行相应的用户反馈。同时对于一些电量的监控,强制下线退出等功能,我们都可以通过广播来实现。
广播的使用
首先,我们需要有一个广播接收器,当接收器接收到消息的时候,就会invoke onReceive()这个方法,我们所要进行的相关处理就可以放在这里面。
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Receive a message",Toast.LENGTH_SHORT);
}
}
创建完了广播,还是不可以使用的,四大组件在使用之前,都是需要我们进行注册。此处的注册方式有两种。
动态注册广播
public void setBroadcast(){
//意图过滤,通过对其action的设置来确定其所能够接受的广播类型
IntentFilter filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVY_CHANGE");
//广播注册
MyReceiver mReceiver = new MyReceiver();
registerReceiver(mReceiver,filter);
}
静态注册
即为在清单文件中,添加action
自定义发出广播
创建一个意图,然后发送即可,然后注册广播接收者,通过对相应的aciton的接受既可实现对自定义广播的接收。
public void sendBroadcast(){
Intent intent = new Intent("MY_ACTION");
sendBroadcast(intent);
}
广播的分类
广播分为有序广播和标准广播两个类,两类广播存在着一些本质性的差别。
有序广播
顾名思义,这样的广播是存在顺序的,属于同步的一种方式,如果多个应用内存在同样的接收器,那么将会按照事先设定的优先级来对其进行发送广播。因此,首先接收到广播的就可以对广播进行相应的处理,或者是将其拦截。
创建实例
public void sendBroadcast(){
Intent intent = new Intent("MY_ACTION");
sendOrderedBroadcast(intent,null);
}
截获广播
abortBroadcast();
标准广播
这种广播是一种异步的发送形式,对于接收者不存在先后关系,都是同时接受到的。
广播安全问题
通过上面的实例,我们可以发现如果对于任何一个应用程序都可以接受其它应用程序发出的相应广播,同时又可以向接收器发送相应的广播,那么如果其中包含一些畸形数据等,将会对程序造成很严重的影响。同时也会导致一些程序内数据的泄露。
Android提供的解决该问题的方式就是通过一个本地广播管理类,通过这个类进行的相应广播管理,这些广播就只能够在应用内进行接受和发送。
public void sendBroadcast(){
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent("MY_ACTION");
manager.sendBroadcast(intent);
}
在对应用进行注册的时候,也是需要通过这个管理类来进行管理
public void setBroadcast(){
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVY_CHANGE");
MyReceiver mReceiver = new MyReceiver();
manager.registerReceiver(mReceiver, filter);
}