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

来源:互联网 发布:淘宝怎么设置不包邮 编辑:程序博客网 时间:2024/05/22 14:09

安卓中的广播事件分为两种,一种是系统的广播;一种是自定义的广播。


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


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


静态的需要在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{@Overridepublic 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{@Overridepublic 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收到一个消息,需要在界面中显示出来,就用到了。



0 0
原创粉丝点击