首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

Activity、Bundle、请求码与结果码、Intent、播音、服务 (三)

2012-09-02 
Activity、Bundle、请求码与结果码、Intent、广播、服务 (三)广播接收者(BroadcastReceiver)?广播接收者(Broadc

Activity、Bundle、请求码与结果码、Intent、广播、服务 (三)

广播接收者(BroadcastReceiver)

?

广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:

第一步:继承BroadcastReceiver,并重写onReceive()方法。

public class IncomingSMSReceiver extends BroadcastReceiver {

@Override public void onReceive(Context context, Intent intent) {

}

}

第二步:订阅感兴趣的广播Intent,订阅方法有两种:

第一种:使用代码进行订阅

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomingSMSReceiver();

registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:

<receiver android:name=".IncomingSMSReceiver">

?? ?<intent-filter>

?? ? ? ? <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

?? ?</intent-filter>

</receiver>

?

注:

?

Context.startActivity(Intent) ? ----->只能被一个组件(Activity / Service)接受

Context.sendBroadcast(Intent)----->能被订阅了此意图的所有广播接受者所接受


Activity、Bundle、请求码与结果码、Intent、播音、服务 (三)


Activity、Bundle、请求码与结果码、Intent、播音、服务 (三)

?

例子:使用广播接收者窃 听短信

?

如果你想窃 听别人接收到的短信,达到你不可告人的目的,那么本节内容可以实现你的需求。

当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。

public class IncomingSMSReceiver extends BroadcastReceiver {

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

@Override public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(SMS_RECEIVED)) {

SmsManager sms = SmsManager.getDefault();

Bundle bundle = intent.getExtras();

if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus");

SmsMessage[] messages = new SmsMessage[pdus.length];

for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

for (SmsMessage message : messages){

String msg = message.getMessageBody();

String to = message.getOriginatingAddress();

sms.sendTextMessage(to, null, msg, null, null);

}}}}}

在AndroidManifest.xml文件中的<application>节点里对接收到短信的广播Intent进行订阅:

<receiver android:name=".IncomingSMSReceiver">

<intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>

在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->

<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->

?

?

除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。

?接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:

<receiver android:name=".IncomingSMSReceiver">

?? ?<intent-filter>

?? ? ? ? <action android:name="android.intent.action.BATTERY_CHANGED"/>

?? ?</intent-filter>

</receiver>

?

?接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:

<receiver android:name=".IncomingSMSReceiver">

?? ?<intent-filter>

?? ? ? ? <action android:name="android.intent.action.BOOT_COMPLETED"/>

?? ?</intent-filter>

</receiver>

并且要进行权限声明:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>



注意:通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比较耗时的工作,可以通过发送Intent给Activity或Service或还创建一个线程来完成工作,由Activity或Service来完成。public class IncomingSMSReceiver extends BroadcastReceiver {@Override public void onReceive(Context context, Intent intent) {?? ? ? ? ? ?//发送Intent启动服务,由服务来完成比较耗时的操作?? ? ? ? ? ?Intent service = new Intent(context, XxxService.class);?? ? ? ? ? ?context.startService(service);?? ? ? ? ? ?//发送Intent启动Activity,由Activity来完成比较耗时的操作?? ? ? ? ? ?Intent newIntent = new Intent(context, XxxActivity.class);?? ? ? ? ? ?context.startActivity(newIntent);}}

?



?

热点排行