- 女孩:BroadcastReceiver是什么呀?
- 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和广播接收器是Android中需要了解的,那么怎么样去了解呢~
广播,大家应该可以理解,我们在学校做眼保健操时,就有个广播,告诉我们要做眼保健操了。广播传递信息告诉我们要做什么,通知信息或传递数据等。广播接收器是用来接收来自系统和应用的广播。
在Android中提供了两种主要的类型广播:标准广播和有序广播。
什么是广播呢?在手机的消息提示框,对话框或通知的形式告诉我们,如我们手机没电了,会弹出提示,接收短信弹出提示等。而Broadcast Receiver为广播接收器,是接收广播的组件。
- 女孩:那么哥,什么是普通广播和有序广播?
- 男孩:额,在这里你要了解一下普通广播和有序广播,主要讲一下。~
普通广播:
Normal broadcasts,是一种完全异步执行的广播,当广播发出后,几乎所有广播接收器都会在同一时间收到这条广播。如下图:
这相当于有人在广播室里,播放做眼保健操的信息,一同发出到每个教室一样,没有先后顺序之分,对于普通广播是无法终止广播的传播,一旦发送,无法截断其中一条,几乎被所有接受者收到,而我们做眼保健操的就是接受者了。对于普通广播,在Android中使用Context.sendBroadcast()方法来发送。
有序广播:
有序广播,Ordered broadcasts,是一种同步执行的广播,广播发出后,只会有一个广播接收器能接收到广播消息,当这个广播接收器接收到后,广播才会继承传递,对于有序广播有了先后顺序,在Android中提供了优先级的属性(priority)来控制先后,有序广播中可以截断广播,不被下一个广播接收器接收,这是有序广播的特点。
在这里你了解了普通广播和有序广播的原理,这两种其实就是广播的接收的不同表现形式而已。
BroadcastReceiver的实现:
到头来还是要了解BroadcastReceiver的实现,接下来我列出主要的内容目录,对于广播接收器是我们要掌握的,是Android中重要的四大组件之一。
接收系统广播
你或许会问一下什么又是系统广播,对于掌握手机概念的,应用懂得系统,如:电池电量低,发送系统广播消息;安装新应用,广播安装信息等。
广播注册分动态和静态两种:
动态注册,需要继承BroadcastReceiver的,并重写onCreate()方法,和onReceive()方法,在onReceive()方法中,要实例接收器和IntentFilter实例。接着继续重写onDestroy()方法,加入unregisterReceiver()方法来实现取消注册。
在动态注册的广播接收器中最后一定要取消注册。
简化:
重写onCreate()
重写onDestroy()
extends BroadcastReceiver
重写onReceive()
静态注册,只要在配置文件中修改代码即可,在AndroidManifest.xml文件中:
<receiver android:name=包名.类名>
<intent-filter>
<action android:name="发送的广播"
</intent-filter>
</receiver>
这里补充说一个自定义的广播接受者
步骤:同样
- 继承BroadcastReceiver基类
- 复写抽象方法onReceive()方法
以上为发送普通广播的实现形式,那么你还记得一个有序广播吗?对于有序广播的形式很简单,也是和普通广播一样实现。只在发送有差异而已。
有序广播和普通广播差异:只要修改普通广播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可,你会觉得难记吗?
广播接收器(Broadcast Reveiver)
标准广播(Normal broadcasts)
有序广播(Ordered broadcasts)
这里说一下,我把标准广播说错成标准广播了,其实这里标准和普通随意叫吧,不过为了显示技术牛逼,在外人前尽量说标准广播吧。ok?
使用本地广播:
什么又是本地广播呢?你会问道,本地广播是Android引入的一套机制,为本地广播机制,使用本地广播机制,有很多优点:
- 不用但系机密数据被泄漏;
- 不用担心安全漏洞的隐患;
- 更加高效。
在介绍本地广播之前,前面讲的广播室一种全局的,属于系统全局广播,广播室一个全局的监听器,在Android中,我们要知道广播有两种说法:广播发送者和广播接收者。
在本地广播重点说明:本地广播没有静态注册的方式,静态注册是为了程序在未启动前也能收到广播,而发送本地广播时,我们的程序是已开启了的。
- 女孩:哥,讲的差不多了,已经掌握了,不过可以写一些代码例子吗?
- 男孩:嗯,可以,掌握就牛逼了~
代码示例:
// 继承BroadcastReceivre基类
public class MyBroadcastReceiver extends BroadcastReceiver {
// 复写onReceive()方法
@Override
public void onReceive(Context context, Intent intent) {
//写入接收广播后的操作
}
}
示例动态注册:
private IntentFilter intentFilter;
private MyReceiver myReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
示例静态注册:
<receiver android:name=".包名" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
最后都要加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
发送自定义广播:
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要发送的广播值
sendBroadcast(intent);
发送有序广播:
//sendOrderedBroadcast()方法
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要发送的广播值
sendOrderBroadcast(intent,null);
<intent-filter android:priority="100">
...
</intent-filter>
//优先级
abortBroadcast();
//截断
本地广播:
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//获取实例
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.....");
myReceriver = new MyReceriver();
localBroadcastManager.registerReceiver(myReceriver, intentFilter);
Intent intent = new Intent("com...");
localBroadcastManager.sendBroadcast(intent);
//发送本地广播
localBroadcastManager.unregisterReceiver(myReceiver);
总结
有关内容就到这里了,本篇介绍了四大组件中的广播组件的知识点。