BroadcastReceiver--Android广播机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BroadcastReceiver--Android广播机制相关的知识,希望对你有一定的参考价值。
什么是广播
生活中的电视频道、收音机、手机、都有自己的特定广播,他们不管是否有人关心、收听等,不管你是否看电视,每个频道都实施按照自己的进步进行播放、收音机也是!所以我理解的android广播机制也就是这样--广播发布者只负责把发生的事件发出,至于是否有接听者或者接听者接收到怎样处理并不关心。
- 我们都知道电台发送的内容大都以语音播报为主,而android中我们的BroadcastReceiver相当于一个事件,内容存放到intent中,由它来完成传输工作,至于是否进行处理是由intent-filter里的参数进行匹配筛选找出自己关心的,然后进行操作
- 生活中用户通过调整具体的频道、频率来接受电台、电视的信息。android中要接受广播的内容是通过注册一个广播的形式来接受特定的广播,并且只有发送的action和接收广播的action相同,有时候集体到发布的内容,接受者才可以接受到这个广播
- android中发布广播通过sendBroadcast这个方法来发送
广播在android中的用途
从上面的介绍不难发现,用来传输数据。具体如下:
- .实现了不同的程序之间的数据传输与共享,只要发送和接收都在同一个action就能轻松实现。比如常用的接收到了短信,那么android已经写好一个广播进行处理,解析展示到手机收件箱里,点击显示发送者的内容等,不想接听某人的电话或者短信,都可以使用广播进行实现,所以广播在android中的应用还是十分广泛的。
- 通过广播可以实时更新主ui,更然更新主ui的方法还有很多。
怎样实现广播
现在我们就来实现一个简单的广播程序。Android提供了两种注册广播接受者的形式,分别是在程序中动态注册和在xml中指定。他们之间的区别就是作用的范围不同,程序动态注册的接收者只在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动有会起作用。首先介绍在程序中动态注册的方式。
- 动态注册方式:不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
- 配置文件方式:常驻型xml清单注册,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。不管是否启动这个应用,只要开机,广播就 在后台时刻监听着。
Android有系统广播也可以自定义广播,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,下面一个小程序来进行展示广播的应用。
一、注册(当实现了广播接收器,还要设置广播接收器接收广播信息的类型,这里是信息:android.provider.Telephony.SMS_RECEIVED)
- 动态注册方式
-
1234567
//生成广播处理
smsBroadCastReceiver =
new
SmsBroadCastReceiver();
//实例化过滤器并设置要过滤的广播
IntentFilter intentFilter =
new
IntentFilter(
"android.provider.Telephony.SMS_RECEIVED"
);
//注册广播
BroadCastReceiverActivity.
this
.registerReceiver(smsBroadCastReceiver, intentFilter);
-
- 在AndroidManifest.xml中配置广播
-
1234567891011121314151617181920212223242526272829
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android"
package
=
"spl.broadCastReceiver"
android:versionCode=
"1"
android:versionName=
"1.0"
>
<application android:icon=
"@drawable/icon"
android:label=
"@string/app_name"
>
<activity android:name=
".BroadCastReceiverActivity"
android:label=
"@string/app_name"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<!--广播注册-->
<receiver android:name=
".SmsBroadCastReceiver"
>
<intent-filter android:priority=
"20"
>
<action android:name=
"android.provider.Telephony.SMS_RECEIVED"
/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion=
"7"
/>
<!-- 权限申请 -->
<uses-permission android:name=
"android.permission.RECEIVE_SMS"
></uses-permission>
</manifest>
-
- 动态注册方式
二、继承BroadcastReceiver,重写onReceiver方法。这里是监听到短信发送,将触发这个广播,然后把短信内容解析出来并展示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class SmsBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Object[] object = (Object[])bundle.get( "pdus" ); SmsMessage sms[]= new SmsMessage[object.length]; for ( int i= 0 ;i<object.length;i++) { sms[ 0 ] = SmsMessage.createFromPdu(( byte [])object[i]); Toast.makeText(context, "来自" +sms[i].getDisplayOriginatingAddress()+ " 的消息是:" +sms[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show(); } //终止广播,在这里我们可以稍微处理,根据用户输入的号码可以实现短信防火墙。 abortBroadcast(); } } |
以上是关于BroadcastReceiver--Android广播机制的主要内容,如果未能解决你的问题,请参考以下文章