Android BroadcastReceiver

    今天来总结一下最近学习Android的四大组件之一BroadcastReceiver。BroadcastReceiver顾名思义,主要用来接收广播,这其中还可以携带额外的数据。Android系统会发出很多广播,例如收到短信,开机等,开机启动某个程序就是利用此组件实现的,那么下面我就举一个开机启动的Demo。

    先来看一下他的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介绍完成了,我不是知识的制造者,我只是知识的搬运工,欢迎拍砖~


Android BroadcastReceiver,布布扣,bubuko.com

Android BroadcastReceiver

上一篇:微信随机红包


下一篇:Android中文TTS语音合成