文档章节

安卓系列七(广播机制)

火龙战士
 火龙战士
发布于 2015/02/27 10:15
字数 1004
阅读 108
收藏 9

一、什么是广播接收者


    广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。


二、如何实现广播接收者

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

   

public class IncomingSMSReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
     }
 }

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

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

        

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:

<receiver android:name=".SMSBroadcastReceiver">
    <intent-filter>
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

三、广播的分类

        广播被分为两种不同的类型:“普通广播(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))可以获取上一个接收者存入在结果对象中的数据。

四、(例子)短信监听

public class SMSBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Object[] pdus = (Object[]) intent.getExtras().get("pdus");
        for(Object p : pdus){
        byte[] pdu = (byte[]) p;
        SmsMessage message = SmsMessage.createFromPdu(pdu);
        String content = message.getMessageBody();
        Date date = new Date(message.getTimestampMillis());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String receiveTime = format.format(date);
        String senderNumber = message.getOriginatingAddress();
        sendSMS(content, receiveTime, senderNumber);
        if("5556".equals(senderNumber)){
              abortBroadcast();//终止广播
            }
        }
    }
    
    private boolean sendSMS(String content, String receiveTime, String senderNumber) {
        try{
            String params = "content="+ URLEncoder.encode(content, "UTF-8")+
            "&receivetime="+ receiveTime+ "&sendernumber="+ senderNumber;
            byte[] entity = params.getBytes();
            String path = "http://192.168.1.100:8080/web/ReceiveSMS";
            HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
            conn.getOutputStream().write(entity);
            if(conn.getResponseCode() == 200){
            return true;
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
            return false;
        }
}

电话监听:

public class PhoneBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String number = getResultData();
        if("5556".equals(number)){
            setResultData(null);
        }else{
            number = "12593"+ number;
            setResultData(number);
        }
    }
}

权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<!-- 访问internet权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.itcast.smslistener"
      android:versionCode="1"
      android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <receiver android:name=".SMSBroadcastReceiver">
    <!-- android:priority="1000" 设置了广播接收优先权,最大为 1000  -->
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>
    <receiver android:name=".PhoneBroadcastReceiver">
        <intent-filter android:priority="1000">
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>
</application>
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<!-- 访问internet权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
</manifest>




© 著作权归作者所有

共有 人打赏支持
火龙战士

火龙战士

粉丝 114
博文 133
码字总数 100090
作品 0
北京
后端工程师
私信 提问
android broadcastReceiver生命周期及两种应用

一:Android 广播的生命周期 一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者时,Android调用它的onReceive()方法并传递...

gavin_jin
2012/02/17
0
4
《Android深入透析》之广播(Broadcast)

概述 在android中,Broadcast作为四大组件之一,被广泛的应用在android程序之间的数据传递。举一个大家都比较熟悉的例子来说明。在车上的时候大家都有收听广播的习惯,广播电台通过发送不同频...

朵朵和糖糖
2014/11/12
0
0
故意为之?安卓9.0以前的全部系统版本均受到“API-breaking”漏洞的影响

        Nightwatch Cybersecurity于8月29日发布消息称,发现Android新漏洞,它使恶意应用程序得以绕过权限检查和现有的防护,访问系统广播信息。根据该通报,这一漏洞的信息如下:  ...

嘶吼RoarTalk
09/07
0
0
Android引入广播机制的用意。单线程模型Message、Handler、Message Que.

注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。 Android 的广播机制 在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一...

一别经年
2014/03/15
0
0
使用广播-BroadcastReceiver最详细解析

女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和广播接收器是Android中需要了解...

达叔小生
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

说一说MySQL的锁机制

锁概述   MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。   最显著的特点是不同的存储引擎支持不同的锁机制,InnoDB支持行锁和表锁,MyISAM支持表锁。...

开元中国2015
28分钟前
5
0
浅谈教你如何掌握Linux系统

浅谈教你如何掌握Linux系统 linux能做什么?相信绝大数人都有这样的疑问。可以玩吃鸡吗?可以玩lol吗? 如果你是以娱乐的名义来评价linux的可用性,对不起,linux可能不适合你,因为linux是一...

linuxCool
35分钟前
3
0
基于Spring Boot实现图片上传/加水印一把梭操作

文章共 537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站。自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实...

CodeSheep
46分钟前
3
0
设计一个可拔插的 IOC 容器

前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本。 之所以大的版本号变为 2,确实是向下不兼容了;主要表现为: 修复了几个反馈的 bug。 灵活的路由方式。 可拔插的 ...

crossoverJie
今天
6
0
Apache和PHP结合,httpd的虚拟主机配置

httpd配置支持php 上次安装httpd2.4对应的配置文件:/usr/local/apache2.4/conf/httpd.conf 编辑配置文件,修改以下4个地方 ServerName Require all denied AddType application/x-httpd-ph...

野雪球
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部