Android的广播接收者比较相对于Service使用方法简单不少。Android中的广播一般用来接收其他应用程序或者类的信息,能够实现各个模块的通信,但需要注意一点,由于广播类对象的生命周期比较短,所以不能在广播里执行耗时操作,例如新建子线程获取网络信息等,而更新UI等一般就放在广播里完成。
要使用Android中的广播,首先需要定义自己的广播类,继承自BroadcastReceiver类,然后重写onReceive方法,待会接收到广播就会调用这个函数。看看下面的demo:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到广播......");
}
}
接着是注册该广播接收器(android的四大组件都要注册),不过广播接收器的注册方式有两种,一种是在代码中注册,一种是在配置文件中注册。
在配置文件中注册:
<receiver
android:name="com.example.broadcasttest.MyReceiver">
<intent-filter android:priority="1000">
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
</intent-filter>
</receiver>
跟其它组件一样,写在<application></application>节点里就行,其中priority表示该广播接收器的优先权,优先权越高(1000到-1000),越先接收到广播(当然你可以接收后拦截掉,不过并不一定会成功)。<action>指定要接收的广播类型,因为我们并不是对什么广播都感兴趣,例如上面的代码中指定了该广播接收器只接收WiFi连接状态发生改变是系统发出的广播。
在代码中注册:
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
//filter.setPriority(1000);
registerReceiver(receiver, filter);
注销广播接收器(一般写在onDestroy中) unregisterReceiver(receiver)
区别:在代码中注册广播接收器,当注册该广播接收器的activity退出时该广播接收器也就不存在了,也就不能再接收广播了,而在配置文件中注册,只有整个应用程序进程退出时(注意按返回键退出程序其实应用程序进程仍在运行)该广播接收器才会被销毁。
上面接收的是系统自动发送的广播,程序员也可以自己发送广播(包括系统预定义广播和自定义广播),发送的广播有两种类型:无序广播和有序广播
无序广播:使用函数sendBroadcast(Intent intent, String receiverPermission),第一个参数是Intent对象,里面需要设置广播的action,第二个是自定义广播权限,不需要时可以写null(当然也可以使用另外一个重载函数),该广播逻辑上所有能接收到该广播的广播接收者会在同一时刻接收带该广播,因为它是无序广播。
有序广播:使用函数sendOrderedBroadcast(Intent intent,String receiverPermission)这个函数的参数跟上面那个一样,不过它发送的是有序广播,优先级最高的广播接收器将会最快接收到广播。接收到后可以使用abortBroadcast()终止该广播,然其它广播接收器不会收到该广播(不是100%的)。
发送有序广播还有这个函数:sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,Handler scheduler, int initialCode, String initialData,Bundle initialExtras),第一二个参数跟上面一样,第三个参数比较重要,这个参数接收一个广播接收者对象,假如优先级高的广播接收器接收到广播后,即使它把广播终止掉了,这个参数指定的广播接收器还是能够接收到这条广播,系统的电话接收这样做的,不然你写一个程序拦截掉电话打过来的广播,然后终止掉了,那你的手机不就听不了电话了?后面那些参数暂时用不到,写null或者0就行。
上次我们说利用绑定方式开启服务能够调用服务里面的方法,利用广播也能实现类似的功能。