Broadcast Receiver包含两部分功能: 发送和接收广播消息
调用sendBroadCast()方法发送广播,即发送一个Intent
发送广播只能启动广播接收器Receiver对象
接收广播Receiver,它和Activity、Service在架构上是平等的
Receiver没有界面,其生命周期非常短,在执行onReceive()方法中才有效,一旦onReceive()
方法执行完毕,该Receiver的生命期就结束,。
广播消息分为两类: 系统定义的一些广播消息和自定义广播消息
接收消息的方式:
静态接收:当程序安装时就声明其内部的广播接收器
动态接收:通过调用registerReceiver()方法向系统注册一个Receiver,动态接收多用于一个应用程序的内部
每个接收器(Receiver)内部都有一个onReceive()方法
同步广播和异步广播
广播的分类
普通广播(Normal Broadcast):是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的传播。
有序广播(Ordered Broadcast):该广播的接收者将按预先声明的优先级依次接收广播。有序广播接收者可以终止广播的传播(通过调用abortBroadcast()方法),广播的传播一旦终止,后面的接收者就无法接收到广播。另外,广播的接收者可以将数据传递给下一个接收者(通过setResultExtras(Bundle bundle)方法)。
发送广播sendBroadcast(intent)
接收广播。四大组件之一---广播接收者Broadcast Receiver。
类似于事件处理。不过事件处理是同一个程序内部,而广播的处理机制则是系统级别的(可用于不同应用程序之间)。
写个类继承BroadcastReceiver,覆盖方法onReceive()
在配置文件中配置
step1.写一个类继承BroadCastReceiver,重写onReceive()方法
step2.在AndroidManifest.xml中注册广播(称为静态注册)
动态注册:
@Overridestep3.发送广播
隐式通过action找到相应的receiver组件
Intent intent = new Intent("com.anjoyo.receiver"); sendBroadcast(intent);
显示通过类名找到本程序的receiver组件
Intent intent = new Intent(context,MyReceiver.class); sendBroadcast(intent);
Receiver例子代码:
public class MyReceiver extends BroadcastReceiver { @Overridepublic void onReceive(Context context, Intent intent) { Intent intent2 = new Intent("com.anjoyo.activity"); intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent2); } }
Activity配置:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.anjoyo.activity"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter></activity>
同步方式发送(sendOrderBroadcastReceiver(intent))的广播,如何注册广播接收器的优先级?通过给
<intent-filter android:priority="1000"><action android:name="com.anjoyo.receiver"/></intent-filter>
值越大优先级越高。
注意:
每次系统广播(Broadcast)事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。
如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在广播接收者的onReceive()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框。
动态注册:
动态创建Receiver
不需要在xml文件中声明该Receiver
需要调用registerReceiver()方法向应用程序的Context注册
receiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.anjoyo.receiver"); registerReceiver(receiver, filter);
一般在程序的onPause()方法中调用unregisterReceiver()以注销Receiver对象
unregisterReceiver(receiver);
如果没有注销Receiver,那么该Receiver会一直处于接收广播消息就绪的状态,直到该程序的Context被销毁
代码实现:接收到开机事件后BroadcastReceiver启动一个Activity作为响应
1.写一个类继承BroadReceiver,实现OnReceiver方法
public class MyReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Intent intent = new Intent(context,MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }
2.完成MainActivity
3.在AndroidManifest.xml配置
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter></receiver>
访问系统开机事件的权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>