android开发之短信监听拦截_BroadcastReceiver的使用

1.广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。     普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高, 但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。          有序广播是按照接收者声明的优先级别,被

大家好,又见面了,我是全栈君。

1.广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。 
    

普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高, 
但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。      
    

有序广播是按照接收者声明的优先级别,被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C 。 
优先级别声明在 intent-filter 元素的 android:priority 属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置。 
有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。 
另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。

        
Context.sendBroadcast() 
发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast() 
发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者, 前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。 
对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。 

 

 

2. 广播接收者(BroadcastReceiver)用于接收广播 Intent,广播 Intent 的发送是通过调用 Context.sendBroadcast()、Context.sendOrderedBroadcast() 来实现的。        
    

通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。

要实现一个广播接收者方法如下: 
              

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

public class IncomingSMSReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
//操作..
   }            
}

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

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

IntentFilter filter = new IntentFilte("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>

 

3.在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法, 

onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。

当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。        

所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。 
 如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。 
这里不能使用子线程来解决,因为 BroadcastReceiver 的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。 
BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。 
如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。 

 

 

4. 其它广播Intent 
除了短信到来广播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"/>

 

 5.接受系统的短信广播,操作短信内容。

AndroidManifest.xml:

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

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

 

<!-- Receiver -->

<receiver android:name=".sms.SMSReceiver">

<intent-filter>

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

</intent-filter>

</receiver>

java:

package org.anymobile.demo.sms;

 

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.telephony.gsm.SmsMessage;

import android.util.Log;

 

public class SMSReceiver extends BroadcastReceiver

{

    public static final String TAG = "ImiChatSMSReceiver";

    //android.provider.Telephony.Sms.Intents

    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

   

    @Override

    public void onReceive(Context context, Intent intent)

    {

       if (intent.getAction().equals(SMS_RECEIVED_ACTION))

       {

           SmsMessage[] messages = getMessagesFromIntent(intent);

           for (SmsMessage message : messages)

           {

              Log.i(TAG, message.getOriginatingAddress() + " : " +

                  message.getDisplayOriginatingAddress() + " : " +

                  message.getDisplayMessageBody() + " : " +

                  message.getTimestampMillis());

           }

       }

    }

   

    public final SmsMessage[] getMessagesFromIntent(Intent intent)

    {

        Object[] messages = (Object[]) intent.getSerializableExtra("pdus");

        byte[][] pduObjs = new byte[messages.length][];

 

        for (int i = 0; i < messages.length; i++)

        {

            pduObjs[i] = (byte[]) messages[i];

        }

        byte[][] pdus = new byte[pduObjs.length][];

        int pduCount = pdus.length;

        SmsMessage[] msgs = new SmsMessage[pduCount];

        for (int i = 0; i < pduCount; i++)

        {

            pdus[i] = pduObjs[i];

            msgs[i] = SmsMessage.createFromPdu(pdus[i]);

        }

        return msgs;

    }

 

}

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121396.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用户行为路径分析(User Path Analysis)「建议收藏」

    用户行为路径分析(User Path Analysis)「建议收藏」什么是用户行为路径?用户行为路径即抽象用户在网站或APP中的访问路径。其可用桑基图展现,称为用户路径图。什么是用户行为路径分析?用户路径分析追踪用户从某个开始事件直到结束事件的行为路径,即对用户

    2022年7月2日
  • 发送邮件常见出错代码及简单解决方法

    发送邮件常见出错代码及简单解决方法

    2021年10月7日
  • PHP实现敏感词过滤系统「建议收藏」

    PHP实现敏感词过滤系统「建议收藏」码说明1、敏感词库维护更新脚本:reload_dict.php,提供自动更新字典库到trie-tree文件的过程PHP<?php//设置内存ini_set(‘memory_limit’,’128M’);//读取敏感词字典库$handle=fopen(‘dict.txt’,’r’);//生成空的trie-tree-filter$resTrie=trie_filter_new();while(!feof($handle)){$it

    2022年6月13日
  • Java安全之初探weblogic T3协议漏洞

    Java安全之初探weblogicT3协议漏洞文章首发自安全客:Java安全之初探weblogicT3协议漏洞0x00前言在反序列化漏洞里面就经典的还是莫过于weblogic的反序列化漏洞

    2021年12月12日
  • OPKG命令执行过程分析

    OPKG命令执行过程分析一、简介Opkg是一个基于ipkg的轻量级的软件包管理系统,主要用于嵌入式系统,目前应用opkg的有OpenWRT和OpenEmbedded。1Opkg的详细使用方法可以参考OpenWRT的WIKI页面2,不再赘述,本文将重点解释opkg的工作原理。Opkg的源代码可以在GoogleCode3或YoctoProject4上找到。Opkg的版本目前到了0.3.05,我使用的

    2022年6月6日
  • pandas读取excel某一行_python读取csv数据指定行列

    pandas读取excel某一行_python读取csv数据指定行列pandas中查找excel或csv表中指定信息行的数据使用loc函数来查找。话不多说,直接演示:有以下名为try.xlsx表:例如查找A部门所有成员的的姓名和工资或者工资低于3000的人:代码如下:importpandasaspd#导入pandas库excel_file=’./try.xlsx’#导入文件data=pd.read_excel(excel_file)#读入数据print(data.loc[data[‘部

    2022年10月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号