执行效果图:

预备知识:

为了监听指定的ContentProvider的数据的改变,须要通过ContentResolver向指定Uri注冊CotentObserver监听器。ContentResolver提供了例如以下方法来注冊监听器:

publicfinal void registerContentObserver(Uriuri, boolean notifyForDescendents, ContentObserver observer)

參数:uri :该监听器所监听的ContentProvider的Uri。

notifyForDescendents :为false 表示精确匹配。即仅仅匹配该Uri,为true 表示能够同一时候匹配其派生的Uri。

observer:ContentObserver派生的监听器实例。

 取消注冊监听器:

public finalvoid  unregisterContentObserver(ContentObserver observer)

功能:取消对给定Uri的观察

參数: observer ContentObserver的派生类实例。

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些对应的处理,它类似于数据库技术中的触发器(Trigger)。当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器。对应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有

关的。

ContentObserver类介绍:

接收回调的更改内容。

必须由被加入到一个ContentObservable对象实现。

 构造方法:

Public Constructors

ContentObserver(Handler handler)

onChange() will happen on the provider Handler.

说明:全部   ContentObserver的派生类都须要调用该构造方法

參数:handler  Handler对象。能够是主线程Handler(这时候能够更新UI 了),也能够是不论什么Handler对象。

 经常用法:

Public Methods

boolean

deliverSelfNotifications()

Returns true if this observer is interested in notifications for changes made through the cursor the observer is registered with.

final void

dispatchChange(boolean selfChange)

void

onChange(boolean selfChange)

This method is called when a change occurs to the cursor that is being observed.

说明:

void onChange(booleanselfChange)

功能:当观察到的Uri发生变化时,回调该方法去处理。全部ContentObserver的派生类都须要重载该方法去处理逻辑。

參数:selfChange 回调后。其值一般为false,该參数意义不大(我也不懂。理解方法最重要)。

观察特定Uri的过程例如以下:

1、    创建我们特定的ContentObserver派生类。必须重载父类构造方法。必须重载onChange()方法去处理回调后的功能实现

2、   利用context.getContentResolover()获得ContentResolove对象。接着调用registerContentObserver()方法去注冊内容观察者

如://为content://sms的数据改变注冊监听器getContentResolver().registerContentObserver(Uri.parse

("content://sms"), true,
new SmsObserver(new Handler()));

3、   因为ContentObserver的生命周期不同步于Activity和Service等。因此,在不须要时,须要手动的调用unregisterContentObserver()去取消注冊。

短信相关权限:

<!--  发送消息-->

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

<!--  阅读消息-->

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

<!--  写入消息-->

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

<!-- 接收消息 -->

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

相关的协议:

content://sms/inbox        收件箱

content://sms/sent        已发送

content://sms/draft        草稿

content://sms/outbox        发件箱

content://sms/failed        发送失败

content://sms/queued        待发送列表

数据库中sms相关的字段及说明:

字段

说明

_id

短信序号,如100

  thread_id

对话的序号,如100,与同一个手机号互发的短信。其序号是同样的  

  address

发件人地址,即手机号。如+86138138000  

  person

发件人,假设发件人在通讯录中则为详细姓名。陌生人为null  

  date

日期。long型,如1346988516。能够对日期显示格式进行设置  

  protocol

协议0SMS_RPOTO短信,1MMS_PROTO彩信  

  read

是否阅读0未读,1已读  

  status

短信状态-1接收,0complete,64pending,128failed  

  type

短信类型1是接收到的,2是已发出  

  body

短信详细内容

  service_center

短信服务中心号码编号。如+8613800755500

应用实例:

package com.jph.monitorsms;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
/**
* Describe:</br>
* 获取用户正在发送的短信
* 本实例通过为content://sms的数据改变注冊监听器来
* 获取手机正在发送的消息。 * @author JPH
* Date:2014.07.20
* */
public class MonitorSms extends Activity {
TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtView=(TextView)findViewById(R.id.txtView);
//为content://sms的数据改变注冊监听器
getContentResolver().registerContentObserver(Uri.parse
("content://sms"), true, new SmsObserver(new Handler()));
}
//一个继承自ContentObserver的监听器类
class SmsObserver extends ContentObserver{ public SmsObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
//查询发送向箱中的短信
Cursor cursor=getContentResolver().query(Uri.parse(
"content://sms/outbox"), null, null, null, null);
//遍历查询结果获取用户正在发送的短信
while (cursor.moveToNext()) {
StringBuffer sb=new StringBuffer();
//获取短信的发送地址
sb.append("发送地址:"+cursor.getString(cursor.getColumnIndex("address")));
//获取短信的标题
sb.append("\n标题:"+cursor.getString(cursor.getColumnIndex("subject")));
//获取短信的内容
sb.append("\n内容:"+cursor.getString(cursor.getColumnIndex("body")));
//获取短信的发送时间
Date date=new Date(cursor.getLong(cursor.getColumnIndex("date")));
//格式化以秒为单位的日期
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
sb.append("\n时间:"+sdf.format(date));
System.out.println("查询到的正在发送的短信:"+sb.toString());
Toast.makeText(MonitorSms.this, sb.toString(), Toast.LENGTH_LONG).show();
txtView.setText(sb.toString());
}
super.onChange(selfChange);
} } }

Android开发之监听发出的短信的更多相关文章

  1. Android开发-之监听button点击事件

    一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加X ...

  2. Android开发14——监听内容提供者ContentProvider的数据变化

    一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider:A应用修改了B应用的数据,插入了一条数据.有这样一个需求,此时C应用需要得到数据被修改 ...

  3. android开发事件监听

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...

  4. delphi xe5 android 开发实现手机打电话和发短信

    转载自  http://www.raysoftware.cn/ 其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功 ...

  5. XE5 Android 开发实现手机打电话和发短信 [转]

    其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...

  6. android开发学习:打电话和发短信

    1.新建一个android项目 File--New--Other--android application project 填写application name(就是应用的名字.比方:天天酷跑) 填写 ...

  7. adnroid 监听收到的短信并根据短信内容进行回复短信

    定义一个广播接收器 public class SMSReceiver extends BroadcastReceiver { private SmsManager smsManager; @Overr ...

  8. 【Android开发】监听图库数据库的变化

    步骤一: 保存图片或者删除之前,初始化ContentObserver ScreenshotContentObserver mScreenObserver = new ScreenshotContent ...

  9. android 开发,视频群聊引发短信异常

    说到 NDK 开发,其实是为了有些时候为了项目需求需要调用底层的一些 C/C++ 的一些东西:另外就是为了效率更加高些. 但是很多时候能不用就不用:这个是啥原因?个人感觉有些时候是觉得麻烦,首先要配置 ...

随机推荐

  1. CentOS系统中出现错误--SSH:connect to host centos-py port 22: Connection refused

    我在第一次搭建自己的 hadoop2.2.0单节点的伪分布集成环境时遇到了此错误,通过思考问题和查找解决方案最终搞定了这个问题,其错误原因主要有以下几种: 1)SSH服务为安装 此时,采用在线安装的方 ...

  2. WPF学习之路一

    前段时间一直在学习MVC,工作需要,现在需要180度急转弯,搞WPF,MVVM,只能找资料学习了. WPF中有一个消息机制,就是当前台控件绑定的值改变时,会自动通知到指定的事件来改变VM的值,反之亦然 ...

  3. cocoaPods打包的静态库

    cocoaPods管理自己的静态库供其它人下载使用(直接使用上一篇用cocoaPod打包的静态库)(1) 创建github仓库 (2) 下载仓库到本地 (3) 将打包好的framework放到项目中 ...

  4. javascript获取年月日

    javascript获取年月日代码片段 function getNowDate() { var date = new Date(); var split = "-"; var ye ...

  5. Java多线程学习之ThreadLocal源码分析

    0.概述 ThreadLocal,即线程本地变量,是一个以ThreadLocal对象为键.任意对象为值的存储结构.它可以将变量绑定到特定的线程上,使每个线程都拥有改变量的一个拷贝,各线程相同变量间互不 ...

  6. Django 入门案例开发(中)

    昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务: 以下的业务都是假设的(网上书店   页面做的low): 1.用户注册及登录业务: 这是一个网上书店阅读 ...

  7. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  8. js实际工作中的技能点

    1.基础知识 a.原型,原型链 b.作用域,闭包 c.异步,单线程 2.JS API a.DOM操作 b.Ajax c.事件绑定 3.开发环境 a.版本管理(git) b.模块化(require.js ...

  9. STM32F030如何正确配置IO口的复用功能

    本文所使用的单片机型号为STM32F030C8T6. 在030系列的单片机中,PA2引脚除了作为普通的IO引脚用作输入输出功能以外,还可以作为内部外设串口1,串口2,定时器15通道1这三个外设的功能引 ...

  10. jq获取被选中的option的值。jq获取被选中的单选按钮radio的值。

    温故而知新,一起复习下jq的知识点. (1) jq获取被选中的option的值 <select id="select_id"> <option value=&qu ...