广播
就是用来通知APP信息的,分为静态和动态注册广播接受
静态注册
就是通过配置AndroidManifest.xml来进行广播接收的,首先我们要先写一个类,这个类也就是我们广播接收者类,要继承BroadcastReceiver
这个类,并且重写onReceive
方法,实例代码:
1 | package com.example.android_study17; |
(注意这个类要用public修饰,内部的话呢还要用static修饰)(静态注册的时候)
传进来的intent是用来传输对象的,context就是上下文,我们可以通过获取结果数据getResultData
,然后添加需要的东西setResultData
进行数据改变。
我们写好这个类之后,我们就要进行配置,我们要监听手机拨号这个广播:
首先我们要先获取相对应的权限:
1 | <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> |
有了权限之后,我们就需要配置接受者了:
1 | <receiver android:name="com.example.android_study17.MyBroad"> |
receiver的名称是我们的类名,
有了包名就不需要写全了:
1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
有了package其实就不需要写全名了。下面的intent-filter里面写的那个是你要收听广播的名称。
之后我们一要打电话了就可以进行数据的获取了。
静态注册的优点就是即使你关闭了程序,我们的类还是能够收听广播,而缺点就是因为一直收听所以只有卸载了才不会收听了。
动态注册
动态注册是根据需要在什么时候开始和结束监听:
注册:
1 | IntentFilter filter = new IntentFilter(); |
注册好之后,我们也是可以注销的:
1 | unregisterReceiver(br); |
动态注册的那个类没必要是public的,动态注册的优点就是灵活性高一些,但是程序关闭之后就算你没有注销广播,他一样还是会自动注销的,也就是说你收听不到了。
发送广播
就是我们给广播接收者发送广播:
1 | Intent intent = new Intent(); |
首先是这个intent可以带数据,我们要先进行设置域名,重载的方法有第二个参数,这个就是要求我们拥有的权限,所以我们要进行权限的分配,因为是我们自定义的权限,所以我们需要线进行全线的声明,然后再授权:
1 | <permission android:name="com.wker.permission.xxx"/> |
这个样子就可以了,我们要接受这个广播的话呢,我们就要在动态或者静态注册中设置设个intent的URI:
1 | filter.addAction("wker666.github.io"); |
发送广播的时候分为两种,一种是有序的,还有一种是无序的。
- 无序的就是用
sendBroadcast
方法,他是异步执行,不能够使用哪个get,set方法还有abortBroadcast
方法。 - 有序的就是有执行先后顺序的执行,可以使用上面的方法,会根据广播接收者的优先级进行收听。
- 动态设置优先级:
1
filter.setPriority(1);
- 静态设置优先级优先级相同时,在AndroidManifest.xml先注册的先运行。
1
2
3<intent-filter android:priority="1">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
优先级从-1000到+1000,数值越大优先级越大。
在有序中,我们使用get,set方法设置的参数,是因为我们调用的重载的这个API方法:
1 | sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras); |
第三个参数是最后一个执行的广播接收者。
实例
一个监视短信接收的实例,首先我们需要配置我们的权限:
1 | <uses-permission android:name="android.permission.RECEIVE_SMS"/> |
我们有了权限之后我们就要编写我们的类:
1 | package com.example.android_study18; |
这个就是说,我们接受到短信之后我们就可以连同着获得intent携带者的bundle对象,通过这个对象获取键为“pdus”的值,然后强转为object数组,这个数组里面有我们需要的信息,然后用增强for循环来遍历这个数组,通过SmsMessage.createFromPdu
这个静态方法获取短信信息的对象,然后调用方法获得相对应的信息。
配置广播接收者:
1 | <receiver android:name="com.example.android_study18.SMSReceiver"> |
有一点就是eclipse不会提示我们这个短信的名称,不知道为什么,测试的时候通过安卓模拟器自带的那个发短信功能就可以测试:
可以发现广播接收者的优先级是高于之前的内容监听者的。