您的位置:首页 > 其它

从安卓获取短信内容为例 浅谈安卓的广播的使用

2016-06-02 15:17 351 查看
安卓中的广播事件分为两种,一种是系统的广播;一种是自定义的广播。

系统的广播:

手机在收到短信,接到电话,系统都会向所有应用发送广播,如果程序中声明了获取短信等先关权限就能获取这些广播,从而获取自己想要的相关信息,如短信内容等。

自定义的广播:

可以在程序中发送广播,目前我了解的只能是本程序来接收这些广播。

下面说下接收广播的方式。要想接收广播,需要先注册广播接收器,一种静态的,一种动态的。

静态的需要在AndriodManifest.xml中的application标签下加入如下代码:

<!--短信广播接收者  -->
<receiver android:name="com.ldkj_bank.www.util.SmsReciver" >
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

这段代码的意思是SmsReciver这个类可以接收短信的广播。当然,这个类必须继承自BroadcastReceiver

动态的需要创建专门的广播接收类,此类继承于BroadcastReceiver

//=========================广播接收器==========================================================
private class MyBroadcastRecv extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg = null;
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
Date date = new Date(msg.getTimestampMillis());//时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String receiveTime = format.format(date);
System.out.println("number:" + msg.getOriginatingAddress()
+ "   body:" + msg.getDisplayMessageBody() + "  time:"
+ msg.getTimestampMillis());

//在这里写自己的逻辑
if (msg.getOriginatingAddress().equals("1069020510184195")) {
//这里我是要获取自己短信服务号码中的验证码~~
Pattern pattern = Pattern.compile("[0-9]{6}");
Matcher matcher = pattern.matcher(msg.getDisplayMessageBody());
if (matcher.find()) {
String res = matcher.group().substring(0, 6);
final EditText numberText = (EditText) numberDialog.findViewById(R.id.pay_pwd);
numberText.setText(res);
}

}

}
}

}

}
广播接收器设置好了,就要告诉它需要接收什么类型的广播了,就是绑定接收广播的类型.可以参考下边的函数:

//注册广播接收器
private void regBroadcastReceiver(){
broadcastRecv = new MyBroadcastRecv();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
;
registerReceiver(broadcastRecv, filter);
}
这段程序的意思就是broadcastRecv可以接收短信的广播。

接收系统的广播还要在AndriodManifest.xml文件中声明的权限。例如上边所说的获取短信的权限。要加入如下代码:

<!--获取读取短信的权限  -->
<uses-permission android:name="android.permission.RECEIVE_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_SMS" >
</uses-permission>


以上所说的均为获取系统的广播,那么如果我在程序中,想要自己想要发送一个广播,然后让其他的程序接收怎么办呢?
下边是截取的发送广播的一段代码:

//发送用户更新广播
private void sendPersonHasChangedBroadcast(){
Intent intent = new Intent();
intent.setAction(Constant.personHasChangedAction);
sendBroadcast(intent);
}
Constant,personHasChangeAction是一个自定义字符串,便于接收端接收区分是什么广播,这样就发出去了。接收还和上边的接收方式类似。通过广播接收器类的onReceive方法接收。intent.getAction()获取字符串来区分,类如如下代码:

//广播接收器处理类
private class ServiceBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Constant.WIFIACTION) || intent.getAction().equals(Constant.ETHACTION)){
new CheckNetConnectivity().start();
}else if(intent.getAction().equals(Constant.updateMyInformationAction)){
getMyInfomation();
comBridge.joinOrganization();
}else if(intent.getAction().equals(Constant.refuseReceiveFileAction)){
comBridge.refuseReceiveFile();
}else if(intent.getAction().equals(Constant.imAliveNow)){

}
}
}


那么什么时候用自定义广播合适呢?

一般是用于这个程序有service类在界面下来接收、处理请求,或者做其他的事情。需要刷新界面的时候。就发送广播。如果service收到一个消息,需要在界面中显示出来,就用到了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息