本节将通过监听短信的应用来介绍下Android系统中的广播接受者BroadcastReceiver的用法
当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent
如果你的应用向系统声明了可以收到这个广播的话你就可以完全获得该短信的内容,所以,
第一步应该向系统说明你的应用要得到接受短信这个广播,为此,我们要创建一个广播接受者类,继承自BroadcastReceiver,并且覆盖onReceive方法,此方法就是接受到广播时候调用的
public class SMSBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
...
}
}
第二步,必须在清单文件中向系统注册这个广播接受者
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
第三步,我们就可以在onReceive方法中处理接受到的短信了
Object[] pduses = (Object[]) intent.getExtras().get("pdus");//得到所有的短信
for(Object pdus:pduses){
byte[] pdusmessage = (byte[]) pdus;//得到每一条短信
SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);//创建短信bean
String mobile = sms.getOriginatingAddress();//得到发送方的电话号码
String content = sms.getMessageBody();//得到短信内容
Date date = new Date(sms.getTimestampMillis());//得到发送短信的具体时间
//2009-10-12 12:21:23
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//为时间设置格式
String sendtime = format.format(date);
}
最后,加上可以接收短信的权限,就可以实现短信监听的功能了
这样就可以得到短信的所有内容了,你也可以把短信的内容上传到网络上去!
下面摘自传智播客:
广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。
Context.sendBroadcast()
发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast()
发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。
另外,订阅感兴趣的广播还有一种方式,就是通过代码订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();registerReceiver(receiver, filter);