热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android广播接收机制详细介绍(附短信接收实现)

这篇文章主要介绍了Android广播接收机制详细介绍(附短信接收实现),本文讲解了BroadcastReceiver的注册过程BroadcastReceiver的步骤,并给出一个短信广播实现示例,需要的朋友可以参考下

Android中广播(BroadcastReceiver)的详细讲解.

1. BroadcastReceiver的注册过程:
(1).广播消息发出来后,只有订阅了该广播的对象才会接收发出来的广播消息并做出相应处理。
**(2).**Android广播分为两个方面:广播发送者和广播接收者。Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。广播接收者通过Binder机制向AMS进行注册,AMS查找符合相应条件的Broadcastreceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中。消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
(3).广播发送者和广播接收者的执行顺序是异步的,发出去的广播不会关心有无接收者的接收,也不确定接收者是什么时候能接收到。
2. BroadcastReceiver的步骤:
(1).注册广播:广播接收者在AMS中注册广播。
(2).发送广播:广播发送者向AMS中发送广播。
(3).接收广播:广播接收者拿到广播后调用onReceive()方法执行。

以下是一个发送短信的例子,代码如下:

BroadcastReceiverHelper 类:

package com.scd.broadcastreceiver.helper;

import com.scd.broadcastreceiver.activity.MainActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * 广播接收
 * 
 * @author scd
 * 
 */
public class BroadcastReceiverHelper extends BroadcastReceiver {
  /** 上下文 */
  private MainActivity mActivity = null;

  public BroadcastReceiverHelper(MainActivity mContext) {
    super();
    mActivity = mContext;
  }

  @Override
  public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(MainActivity.ACTION_SENDMESSAGE)) {
      toast("发送成功");
    } else if (intent.getAction()
        .equals(MainActivity.ACTION_DELIVERMESSAGE)) {
      toast("接收成功");
    }

  }

  public void toast(String text) {
    Toast.makeText(mActivity, text, Toast.LENGTH_SHORT).show();

  }

}


MainActivity类:

package com.scd.broadcastreceiver.activity;

import com.scd.broadcastreceiver.R;
import com.scd.broadcastreceiver.helper.BroadcastReceiverHelper;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.gsm.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
  private Button mButton = null;
  /** 发送短信 */
  public static String ACTION_SENDMESSAGE = "com.scd.broadcastreceiver.MainActivity.SendMessage";
  /** 接收短信 */
  public static String ACTION_DELIVERMESSAGE = "com.scd.broadcastreceiver.MainActivity.DeliverMessage";
  /** Reciver类 */
  private BroadcastReceiverHelper mHelperS = null;
  private BroadcastReceiverHelper mHelperD = null;
  /** 短信管理类 */
  private SmsManager mSmsManager = null;

  /** 电话号码 */
  private String mTelephOne= "13607567010";

  /** 短信内容 */
  private String mCOntext= "你好,有什么需要帮助的吗?";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mButton = (Button) findViewById(R.id.sendBroadcast);
    mButton.setOnClickListener(this);
    mSmsManager = SmsManager.getDefault();
    // 注册广播
    registerBroadcast();
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.sendBroadcast: {
      //发送广播
      sendBroadcastReceiver(mTelephone, mContext);
      break;
    }

    default:
      break;
    }

  }

  /**
   * 注册广播
   */
  public void registerBroadcast() {
    // 发送
    IntentFilter intentFilterS = new IntentFilter(ACTION_SENDMESSAGE);
    mHelperS = new BroadcastReceiverHelper(MainActivity.this);
    this.registerReceiver(mHelperS, intentFilterS);
    // 接收
    IntentFilter intentFilterD = new IntentFilter(ACTION_DELIVERMESSAGE);
    mHelperD = new BroadcastReceiverHelper(MainActivity.this);
    this.registerReceiver(mHelperD, intentFilterD);
  }

  /**
   * 发送广播 短信发送的过程:发送的时候需要发送广播一次,接收的时候需要发送广播一次
   */
  public void sendBroadcastReceiver(String telephone, String content) {
    if (telephone != null) {
      Intent sIntent = new Intent(ACTION_SENDMESSAGE);
      // 短信成功发送后才发送该广播
      PendingIntent sentIntent = PendingIntent.getBroadcast(
          MainActivity.this, 0, sIntent, 0);

      Intent dIntent = new Intent(ACTION_DELIVERMESSAGE);
      // 短信接收后才发送该广播
      PendingIntent deliveryIntent = PendingIntent.getBroadcast(
          MainActivity.this, 0, dIntent, 0);
      mSmsManager.sendTextMessage(telephone, null, content, sentIntent,
          deliveryIntent);
      // this.sendBroadcast(intent);

    }

  }
}

注意:需要添加以下权限:

 

 
  
  
  
  
  
  


推荐阅读
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
  • Scrapy:强大的Python爬虫框架
    Scrapy是一个基于Python的高效网页爬取框架,利用Twisted异步网络库实现高效的网络通信。其架构设计精巧,包括核心组件如引擎、调度器、下载器等,旨在简化大规模数据抓取过程。 ... [详细]
  • 本章探讨了使用固定数组实现栈和队列的基本方法,以及如何通过这些基本结构来实现更复杂的操作,如获取栈中的最小值。此外,还介绍了如何利用栈来模拟队列的行为,反之亦然。 ... [详细]
  • MainActivityimportandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;im ... [详细]
  • 利用RabbitMQ实现高效延迟任务处理
    本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的Spring Boot实现方式。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文探讨了如何解决HAOI2007竞赛中的理想正方形问题。通过计算矩阵中每个N×N子矩阵的最大值和最小值,最终求得所有子矩阵中最大值与最小值差的最小值。 ... [详细]
  • 深度解析 Redis 消息队列的应用与优势
    本文深入探讨了消息队列的基本概念及其在Redis中的实现方式。通过分析消息队列的核心组件——消息、生产者和消费者,以及它与阻塞队列的主要区别,帮助读者更好地理解如何利用Redis消息队列提高应用性能。 ... [详细]
  • 忙而不盲:探索高效工作的艺术
    本文探讨了在日常工作中如何避免盲目忙碌,通过理解和应对稀有事件、管理负面情绪以及明确学习目标,提升工作效率和个人成长。 ... [详细]
  • 本文探讨了实时操作系统中的两种主要调度策略——速率单调调度与最早期限优先调度,并深入分析了多处理器环境下的调度挑战及优先级反转问题的解决方案。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • java程序员_Java程序员最新职业规划,逆袭面经分享
    java程序员_Java程序员最新职业规划,逆袭面经分享 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
author-avatar
临沂李晓楠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有