BroadcastReceiver是Android系统中的四大组件之一,所有的接收器均继承自BroadcastReceiver基类。
BroadcastReceiver专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的,例如通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播,例如通知其它应用程序一些数据下载完成并处于可用状态。 应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。BroadcastReceiver没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
1.创建BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {}
}
2.注册BroadcastReceiver
(1)静态注册
<application >
<receiver
android:name=".MyBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.myreceiver"/>
</intent-filter>
</receiver>
</application>
(2)动态注册
intentFilter = new IntentFilter();
intentFilter.addAction("com.android.myreceiver");
myBroadcastReceiver = new MyBroadcastReceiver();
registerReceiver(myBroadcastReceiver, intentFilter);
unregisterReceiver(myBroadcastReceiver);
3.发送广播
(1)发送普通广播
普通广播,(使用 Context.sendBroadcast发出)是完全异步的。所有接收者都运行在一个未定义的顺序里,有时甚至同时接收。这很高效,但也意味着不能使用结束或暂停API。
Intent intent = new Intent("com.android.myreceiver");
sendBroadcast(intent);
(2)发送有序广播
有序广播,(使用 Context.sendOrderedBroadcast发出)同一时间只传递一个接收器。每个接收器依次执行,它可以传送结果到下一个接收器,当然也可以暂停传送。这个顺序在android:priority属性里通过 intent-filter定义,如果定义同样的优先级则是随机顺序。
Intent intent = new Intent("com.android.myreceiver");
sendOrderedBroadcast(intent ,null);
4.BroadcastReceiver的生命周期
BroadcastReceiver有一个回调方法,即void onReceive()。当一个广播消息到达接收者时,Android调用它的onReceive()方法并传递给它包含消息的Intent对象。广播接收者被认为仅当它执行这个方法时是活跃的。当onReceive()返回后,它是不活跃的。有一个活跃的广播接收者的进程是受保护的,不会被杀死。但是系统可以在任何时候杀死仅有不活跃组件的进程,当占用的内存别的进程需要时。
特别是,你可能不会显示一个对话框或绑定到一个服务在一个BroadcastReceiver中。对于前者,你应该使用NotificationManager API。对于后者,你可以使用上下文:startservice()将命令发送到服务。
5.进程的生命周期
一个进程,目前正在执行一个BroadcastReceiver(即目前在运行onReceive代码(Context,Intent)函数)被认为是一个前台进程将保持运行的系统除了在极端的内存压力下。
这意味着如果想保持进程长时间运行可以经常利用一个服务去调用BroadcastReceiver来保持进程不被删除。
6.onReceive()方法
这个方法是当BroadcastReceiver收到一个Intent broadcast消息是被调用。该方法是在其进程的主线程调用的,除非明确地要求运行在不同的线程利用registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)这个函数。不允许在主线程做耗时的任务,因此也不要onreceive()推出弹出对话框。
如果这个BroadcastReceiver通过标签发送,当这个函数返回后这个对象将不在存在。这意味着你不应该进行任何操作在返回结果后特别是异步,对正在互动的服务,应该用startService(Intent)代替bindService(Intent, ServiceConnection, int)。如果你希望和正在运行的服务互动,应该调用peekService(Context, Intent)。
被用在registerReceiver(BroadcastReceiver, IntentFilter) 和application manifests的IntentFilter不保证独有。onReceive()实现应该只对已知的action作出反应,忽略那些未知的被收到的Intent。