一:什么是BroadcastReceiver
Broadcast(广播)是一种广泛运用于在应用程序之间一步传播消息的机制
系统消息
Android系统发出的,电池不足、来电信息等
自定义消息
第三方应用发出的广播消息
广播消息本质上就是一个Intent对象
Intent是一对一的通信,广播消息是一对多的通信
BroadcastReceiver用于接受并处理广播消息
BroadcastReceiver没有用户界面
借助其他方式和用户交互,例如,启动Activity、使用Notification等
二.广播消息的处理流程
1.广播消息的处理分为三个环节:1.消息发送 2.BroadcastReceiver注册 3.消息处理
2.系统广播都被定义为android.content.Intent中的Action常量
3.利用BroadcastReceiver实现onReceive方法 。捕获系统广播ACTION_BOOT_COMPLETED可以轻松实现开机后程序自动运行
4.在AndroidManifest.xml文件中增加应用权限声明
<uses-permission android:name="com.mybroadcast.permission"/>
广播消息发送方式有多种
无序广播:sentBroadcast(),效率高,但是消息处理器之间没有关联
有序广播:sendOrderedBroadcast(),可以传递处理数据
持续广播:sendStickyBroadcast()发送的广播一直存在
三.发送一个普通广播
1.发送一个普通广播
//发送一个普通广播(1:发广播,2:注册一个接收者,3:处理广播) public void send_broadcast(View iew){ Intent intent=new Intent(); intent.setAction("com.gdnf.broadcast_1");//自定义一个广播地址 intent.putExtra("message","2018年1月1号放假一天"); //开始广播 sendBroadcast(intent,"com.mybroadcast.permission"); }
2.静态注册一个接收者
1 <!--静态注册一个广播接收者--> 2 <receiver 3 android:permission="com.mybroadcast.permission" 4 android:name="com.example.broadcast_receiver.Broadcast_Receiver_1"> 5 <!--过滤接收什么样的广播--> 6 <intent-filter> 7 <action android:name="com.gdnf.broadcast_1"/> 8 </intent-filter> 9 </receiver>
3.定义一个广播接收者
/** * 定义了一个广播接收者 */ public class Broadcast_Receiver_1 extends BroadcastReceiver{ //对接收到的广播进行处理 @Override public void onReceive(Context context, Intent intent) { Log.i("Broadcast_Receiver_1","Broadcast_Receiver_1接收到广播"); String message=intent.getStringExtra("message"); Log.i("Broadcast_Receiver_1","Broadcast_Receiver_1收到消息:"+message); } }
四.发送一个有序广播
1.
//发送有序广播 public void send_order_broadcast(View view){ Intent intent=new Intent("com.gdnf.broadcast_order");
sendOrderedBroadcast(intent,null,null,null,0,"发放1万过年补贴",null);
}
2.注册接收者,并且声明接收者收到广播的先后顺序
priority降序排列,值最大的,最先收到广播。依次类推
<receiver android:name="com.example.broadcast_receiver.OrderBroadcast_1"> <intent-filter android:priority="10"> <action android:name="com.gdnf.broadcast_order"/> </intent-filter> </receiver> <receiver android:name="com.example.broadcast_receiver.OrderBroadcast_2"> <intent-filter android:priority="9"> <action android:name="com.gdnf.broadcast_order"/> </intent-filter> </receiver> <receiver android:name="com.example.broadcast_receiver.OrderBroadcast_3"> <intent-filter android:priority="8"> <action android:name="com.gdnf.broadcast_order"/> </intent-filter> </receiver>
3.以上面为例 priority="10"最先收到广播可以对广播内容进行修改后再把广播发送出去
public class OrderBroadcast_1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message=intent.getStringExtra("message"); String date=getResultData();//获取数据 Log.i("OrderBroadcast_1","OrderBroadcast_1第一个收到广播"+message); Log.i("OrderBroadcast_1","通知内容是:"+date); setResultData("发放3000过年补贴"); } }
priority="9"接收到的内容已经改变,依次类推。