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(转载请说明出处)

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 收藏几款好用的网页下载工具(网页下载器)「建议收藏」

    收藏几款好用的网页下载工具(网页下载器)「建议收藏」收藏几款好用的网页下载工具(网页下载器)引言webzipTeleportUltraTeleportUltra小飞兔下载MihovPictureDownloaderWinHTTrackHTTrack仿站小工具引言有的人利用网页下载工具下载网站到本地进行慢慢的欣赏,有的人利用下载工具创建垃圾站。不管你是出于什么样的目的,下面这些工具软件你可以会需要。webzip一款国外的网页下载器,把一个网站下载并压缩到一个单独的ZIP文件中,可以帮您将某个站台全部或部份之资料以ZIP格式压缩起来,可供你日后

  • web安全详解(渗透测试基础)[通俗易懂]

    web安全详解(渗透测试基础)[通俗易懂]文章目录一、Web基础知识1.http协议2.网络三种架构及特点3.Web应用的特点4.URL组成6.Http协议的性质7.请求响应报文的格式8.请求方法9.http缓存10.缓存新鲜度如何判断11.Http重定向原理以及状态码12.HTTPS协议数字证书13.HTTPS协议与HTTP协议的区别?14.Web客户端的作用15.Web服务端作用16.集群环境的作用17.什么是Cookie,Cookie的作用。18.Cookie的类型19.session的作用和原理Session的原理Session的两

  • 第二代身份证 验证

    第二代身份证 验证
    今天,在盛大某网站注册的时候,身份证必填,但我又不想填真实身份证号码,于是随便编了串自认为合法的身份证号码,但是却马上被提示号码错误,由于响应速度极快,可以肯定不是联机校验正确性的,那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外,还有另外的自我校验规则。于是翻开页面源码查看,发现这段js没有被压缩,所以规则也很好懂。
    就在这里给大家科普下,不知道是不是火星了,呵呵。
    以下代码来自这里,版权归盛大。当然,你也可以在维基百科找到更详细的介绍和算法。

  • linux的crontab用法_crontab详解

    linux的crontab用法_crontab详解crontab是用来让使用者在固定时间或固定间隔执行程序之用,类似于windows的计划任务安装: yum-yinstallvixie-cron yum-yinstallcrontabs启动、关闭、重启:/sbin/servicecrondstart#启动服务/sbin/servicecrondstop#关闭服务/sbin/servicecrond…

  • 深度搜索算法查找最短路径的方法_深度优先搜索算法

    深度搜索算法查找最短路径的方法_深度优先搜索算法如图,百度地图上有5个地点,各个地点间是单向的路径,试求出从1到5的最短路径。从图中可以得到一个5*5的二维矩阵,利用深度搜索算法,求出最短路径。从最后的运行结果,可以直观的看出搜索的过程代码实现如下:#include"pch.h"#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;vector&g…

  • HashMap的扩容机制—resize()「建议收藏」

    HashMap的扩容机制—resize()「建议收藏」 HashMap的扩容机制—resize()什么时候扩容:当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值(知道这个阈字怎么念吗?不念fa值,念yu值四声)—即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的…

发表回复

您的电子邮箱地址不会被公开。

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