• Android手机使用广播监听手机收到的短信


    我们使用的Android手机在收到短信的时候会发出一条系统广播。该条广播中存放着接收到的短信的详细信息。本文将详细介绍如何通过动态注册广播来监听短信。

    注册广播有两种方式,一种是动态注册,另一种是静态注册。动态注册,顾名思义就是在程序运行时注册的,需要用到广播的时候就注册,用完即销毁。静态注是在AndroidManifest.xml中注册的,在<application>中使用<receiver>标签注册。

    那么如何创建一个监听短信的广播接收器呢,其实只需要新建一个类,让这个类继承BroadcastReceiver,并重写父类的onReceiver方法就可以了。当有广播来了,onReceiver()方法就会执行。

    首先创建一个ListenerSMSBroadcast项目。然后在MainActivity中修改添加代码。现在在MainActivity中创建一个SMSBroadcastReceiver类并继承BroadcastReceiver,然后重写onReceiver方法。

     1 class SMSBroadcastReceiver  extends BroadcastReceiver{
     2 
     3         @Override
     4         public void onReceive(Context arg0, Intent intent) {
     5             
    6
    Object[] object=(Object[]) intent.getExtras().get("pdus"); 7 StringBuilder sb=new StringBuilder(); 8 for (Object pdus : object) { 9 byte[] pdusMsg=(byte[]) pdus; 10 SmsMessage sms=SmsMessage.createFromPdu(pdusMsg); 11 String mobile=sms.getOriginatingAddress();//发送短信的手机号 12 String content=sms.getMessageBody();//短信内容 13 //下面是获取短信的发送时间 14 Date date=new Date(sms.getTimestampMillis()); 15 String date_time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); 16 //追加到StringBuilder中 17 sb.append("短信发送号码:"+mobile+" 短信内容:"+content+" 发送时间:"+date_time+" "); 18
    19 } 20 Message msg=new Message(); 21 msg.what=RECEIVERED_MSG; 22 msg.obj=sb.toString(); 23 handler.sendMessage(msg); 24 } 25 26 }

    以上代码可以看到,SMSBroadcastReceiver类继承了BroadcastReceiver 而且重写了onReceive()方法。在onReceiver()方法中使用intent.getExtras().get("pdus")获取到了一个Object[]类型的数组,而且每一个Object都是byte类型的。然后使用for循环遍历数组,最后使用Handler将短信内容显示在activity中。

    下面是动态注册广播。

    private IntentFilter intentFilter;
        private SMSBroadcastReceiver smsBroadcastReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv_msg=(TextView) findViewById(R.id.tv_msg);
            intentFilter=new IntentFilter();
            intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
            smsBroadcastReceiver=new SMSBroadcastReceiver();
            //动态注册广播
            registerReceiver(smsBroadcastReceiver, intentFilter);
        }

    在这段代码中声明了一个IntentFilter对象,并给它添加了一个值为android.provider.Telephony.SMS_RECEIVED的action。为什么要给它添加这个值呢?因为当手机收到短信的时候系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这正是要监听的广播。接着就创建了一个SMSBroadcastReceiver实例。然后调用registerReceiver()方法注册广播,这里讲SMSBroadcastReceiver实例和IntentFilter实例都传进去,这样SMSBroadcastReceiver就会收到系统收到短信时发送的广播了。

    注意,这里面读取短信,所以需要添加读取短信权限的。只要在AndroidManifest.xml中添加一些权限:

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

    既然是动态注册广播接收器,一定要取消注册。取消注册需要调用unregisterReceiver()来实现。这里面是在onDestroy()方法中取消注册的。

    1     protected void onDestroy() {
    2         super.onDestroy();
    3         //取消注册广播
    4         unregisterReceiver(smsBroadcastReceiver);
    5     }

    本文用到了Handler来修改页面中TextView的text的属性值得。message.what来判断是否要修改text的值,message.obj中是修改的值。

    1 private Handler handler=new Handler(){
    2         
    3         public void handleMessage(android.os.Message msg) {
    4             if(msg.what==RECEIVERED_MSG)
    5             {
    6                 tv_msg.setText("收到的信息:
    "+msg.obj);//
    表示换行
    7             }
    8         };
    9     };
  • 相关阅读:
    ESXi创建磁盘命令
    TNS-12518,TNS-12536,TNS-00506,Linux Error: 11: Resource temporarily unavailable
    监听的instance status blocked分析
    Oracle 用户、对象权限、系统权限
    MIME详解
    11g等待事件之library cache: mutex X
    Latch Free
    PowerDesigner小技巧
    yum本地源配置
    内核参数SEMMSL SEMMNS SEMOPM SEMMNI参数的设置
  • 原文地址:https://www.cnblogs.com/wangpf/p/4276134.html
Copyright © 2020-2023  润新知