先来看一下他的java代码:
public class BootReceiver extends BroadcastReceiver { @Override // 当收到广播时会执行该方法 public void onReceive(Context context, Intent intent) { System.out.println("开机成功, 启动服务"); // 启动服务 } }
它需要继承BroadcastReceiver类,之后冲洗onReceive方法,我在业务逻辑什么都没处理,只是在LogCat中打印了一个开机启动的Log。我们运行它之前还需要在AndroidManifest.xml配置文件中注册一下,代码如下:
<receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
上例中就是监测开机启动的action。接下来继续来介绍如何自定义一个BroadcastSender和BroadcastReceiver。
BroadcastReceiver的广播分为两种,无序广播和有序广播。
比喻一下,无序广播就是我在办公室里大喊一声,XXX木有小JJ,办公室里的同事就是广播接收者(实际上需要配置对应关系),大家都接收到了,几乎没有先后顺序,其实是有顺序的,毕竟有人离我近有人离我远,Android应用手机其实也一样,理论上是一起执行,可是实际上还是按照应用程序安装的先后顺序来执行的。
而有序广播就是我偷偷的写邮件告诉某位同事,XXX木有小JJ,并告诉她下一位传给谁,我的这位同事便可以选择,继续传递、修改内容(改成她自己没有小JJ)或者干脆中断广播。因为是我发送的广播,我可以设置我是最后的广播接收者,也可以不设置,一旦设置我就会是最后一个受到的,无论我的那位同事是否终止传递广播,我永远都是最后一个再接收一次。就像我设置了,然后我的那位同事知道说人坏话不好,就发了一封邮件声讨我,那我便是那最后一位接收者。而我第一个发送给的同事便是优先级最高的广播接收者,可以在配置文件中设置,范围是-1000至1000,默认是0,越大优先级越高,如果数一样就按应用程序安装先后顺序。(PS:XXX是女的,自然木有)
说明白这个区别了,那我就该上例子了,首先是BroadcastSender:
public void send(View view) { Intent intent = new Intent("com.broadcast.TEST"); // 创建用来发送广播的意图对象, 指定广播的类型 intent.putExtra("data", "xxxx"); switch (view.getId()) { case R.id.normalBT: sendBroadcast(intent, "com.permission.BROADCAST"); // 发送无序广播, 可以指定权限 break; case R.id.orderedBT: Bundle bundle = new Bundle(); bundle.putString("name", "张三"); bundle.putInt("age", 20); sendOrderedBroadcast(intent, null, new HisReceiver(), new Handler(), 1, "MainActivity", bundle); // 发送有序广播, 可以指定权限, 可以传递结果数据 break; } }中间带注释,简单说一下参数的含义。
发送无序广播第一个是意图,中间的action参数不是我今天介绍的主要内容,第二个参数是权限,我们可以在AndroidManifest.xml配置文件中获得权限相同位置中加入如下一句代码<permission android:name="com.permission.BROADCAST" />,安装上此应用的手机便可以使用此权限了。
发送有序广播的7个参数中前两个和无序广播相同,第三个参数就类似同事回头声讨的我。第四个参数是程序运行的位置,如果为null则运行在主函数中。最后三个参数都是传递的数据,只是用途不同,想了解详细内容的请自行百度一下。
下面主要介绍有序广播,HisReceiver便是我所说的最后的接收者,具体实现方式与下面想介绍的内容类似,如果下面的代码看懂了,便同样可以实现HisReceiver类。还有一点要说的,HisReceiver由于是最后的接收者,不同于其他的广播接收者,所以不需要在配置文件中注册。
我们还差自定义两个广播接收者用于接收广播,我们定义在不同的工程中,这样才能显示出此功能的强大。代码含义和开头举的例子很相似了:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("MyReceiver收到广播!!"); int code = getResultCode(); // 获取结果数据 String data = getResultData(); Bundle bundle = getResultExtras(true); // true代表如果前面没有放Bundle, 这里会得到一个新创建的Map集合 System.out.println(code + ", " + data + ", " + bundle.getString("name") + ", " + bundle.getInt("age")); code++; data = "MyReceiver"; bundle.putString("name", "李四"); bundle.putInt("age", 21); setResult(code, data, bundle); // 修改结果数据 // abortBroadcast(); // 中断广播 } }上面有详细的注解,我想说的是getResultCode,getResultData以及getResultExtras分别对应刚才我说的有序广播的后面三个参数对应传递的数据。当然,这个需要在配置文件中注册,配置文件如下:
<uses-permission android:name="com.permission.BROADCAST" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <receiver android:name=".MyReceiver" android:permission="android.permission.WRITE_EXTERNAL_STORAGE"> <intent-filter android:priority="1"> <action android:name="com.broadcast.TEST" /> </intent-filter> </receiver> </application>使用上述权限,并对应sender的action,然后配置优先级为1。下面我们来介绍另一个接收者。
public class YourReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("YourReceiver收到广播!!"); int code = getResultCode(); String data = getResultData(); Bundle bundle = getResultExtras(true); System.out.println(code + ", " + data + ", " + bundle.getString("name") + ", " + bundle.getInt("age")); code++; data = "YourReceiver"; bundle.putString("name", "王五"); bundle.putInt("age", 22); setResult(code, data, bundle); } }配置文件中配置优先级为-1。
<uses-permission android:name="com.permission.BROADCAST" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <receiver android:name=".YourReceiver"> <intent-filter android:priority="-1"> <action android:name="com.broadcast.TEST" /> </intent-filter> </receiver> </application>这样,由于1>-1(废话,小学生都知道),所以第一个广播接收者先接收,然后轮到这个接收者,最后再到HisReceiver,无论中间是否中断广播,HisReceiver永远都会受到并且是最后一个收到。
至此,BroadcastReceiver介绍完成了,我不是知识的制造者,我只是知识的搬运工,欢迎拍砖~