在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过 滤接收的过程: 首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。 当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若 匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要 实现onReceive()方法。 注册BroadcastReceiver有两种方式: 一种方式是,静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent- filter>标签设置过滤器。 另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter对象,然后在需要注册的地方调 Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。如果用动 态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。 另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。 同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。 动态注册: IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(String);--为 BroadcastReceiver指定action,使之用于接收同action的广播 registerReceiver(BroadcastReceiver,intentFilter); 一般:在onStart中注册,onStop中取消unregisterReceiver 发送广播消息:extends Service 指定广播目标Action:Intent Intent = new Intent(action-String) --指定了此action的receiver会接收此广播 需传递参数(可选) putExtra(); 发送:sendBroadcast(Intent); |
在BroadcastReceiver配置里intent-filter:action //用于标示接收什么样的action
在Activity要广播的地方设置Intent.setAction();sendBroadcast(in);
也可以在其中动态注册BroadcastReceiver
BroadcastReceiver生命周期:
只是在其onReceiver方法执行的时候才是active;inactive状态下其随时会被系统回收
在onReceiver里执行很耗时的工作时应该开启一个独立的线程。但是一旦onReceiver返回后(不管新线程有没有执行完),
系统都会认为这些资源处于inactive。
也不能bindService。道理同线程
解决方案是在onReceiver里startService,让service完成工作
在BroadcastReceiver配置里intent-filter:action //用于标示接收什么样的action
在Activity要广播的地方设置Intent.setAction();sendBroadcast(in);
也可以在其中动态注册BroadcastReceiver
BroadcastReceiver生命周期:
只是在其onReceiver方法执行的时候才是active;inactive状态下其随时会被系统回收
在onReceiver里执行很耗时的工作时应该开启一个独立的线程。但是一旦onReceiver返回后(不管新线程有没有执行完),
系统都会认为这些资源处于inactive。
也不能bindService。道理同线程
解决方案是在onReceiver里startService,让service完成工作
1.创建Broadcast,首先要有部件发送Broadcast,发送Broadcast的代码如下
Intent intent1 = new Intent(AC1);//AC1为reciver的动作名称。
sendBroadcast(intent1);
此处的AC1要定义:
static final String AC1 = "com.test.action.NEW_BC1";//
2.定义Broadcast的动作:
注意:定义中的"com.test.action.NEW_BC1"是要在Menifest.xml文件中定义的,如下所示:
<receiver android:name="TestRC">
<intent-filter>
<action
android:name="com.test.action.NEW_BC1"/>
</intent-filter>
</receiver>
3.定义BroadcastReciver对象
其中android:name="TestRC"的意思是:该BroadcastReciver对象的名字是TestRC,这个对象接受动作为com.test.action.NEW_BC1 的Broadcast,其定义如下:
public class TestRC extends BroadcastReceiver {
public static int NOTIFICATION_ID = 21321;
Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
Toast.makeText(context, "widget已启动", 0);
showNotification();
}
private void showNotification(){
NotificationManager notificationManager = (NotificationManager) context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon, "bc1", System.currentTimeMillis());
PendingIntent contentItent = PendingIntent.getActivity(context, 0, new Intent(context, Main.class), 0); //Main.class为Broadcast的发出对象
notification.setLatestEventInfo(context, "在bc1中", null, contentItent);
notificationManager.notify(NOTIFICATION_ID, notification);
}
}