现在的位置: 首页 > 综合 > 正文

Android之监听短信变化

2017年12月07日 ⁄ 综合 ⁄ 共 1628字 ⁄ 字号 评论关闭

    通常,在系统的短信发生变化,比如有短信来了,或者要发短信的时候,系统会产生一个广播,然后广播出去,今天主要探讨一下如何监控是否有新的短信接收到,然后如何处理。

网上有很多如下的处理:

当系统收到短信时,会发出一个action名称为android.provier.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称 “pdus”即可从Intent中获取短信内容。

但是,经过实验,该方法理论上虽然可以,但是实际操作非常的难。为何?

原因在于,短信到来的广播属于一个有序广播,所谓有序广播,指的是系统在发送该广播时,是使用sendOrderedBroadcast()  
进行发送,处理方式是,优先级高的先进行处理,优先级低的后进行处理,同时,优先级高的可以中断掉该广播,不让其向下传播。所以,一般在安装有安全类软件的手机,安全类软件会以最高优先级获得该广播,在其处理后会中断该广播,导致我们的程序不能够对短信的变化做出响应。所以,上面的方法不可行,那么怎么样才可以稳定运行?这就是我今天要讨论的问题。

Android为了管理短信彩信等,都是建立在数据库的基础上,发送箱和接受箱都有对应的数据库,当接受到短信时,会将接受的短信写入数据库,当要发送短信时,只需要将要发送的短信写入发送数据库就可以。同时,系统为用户暴漏了一个接口,就是,应用程序可以通过观察者ContentObserver,去监听短信数据的变化:

//注册一个observer进行观察
            getContentResolver().registerContentObserver(Uri.parse("content://sms"),  true, new SmsRecevier(new Handler()));  //当观察的对象变化是调用SmsReceiver进行处理。

private class SmsRecevier extends ContentObserver{

		
		public SmsRecevier(Handler handler) {
			super(handler);

		}

		@Override
		public void onChange(boolean selfChange) {
			Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
			while(cursor.moveToNext()){
				StringBuilder sb = new StringBuilder();
				int isRead ;
				sb.append("id=").append(cursor.getInt(cursor.getColumnIndex("_id")));  //获取短信的内容,关于短信数据库中都有哪些内容,可以参考官方文档,查看其都实现了哪些接口。
				sb.append(",address=").append(cursor.getString(cursor.getColumnIndex("address")));
				sb.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));

                sb.append(";time=").append(cursor.getLong(cursor.getColumnIndex("date")));
                isRead = cursor.getInt(cursor.getColumnIndex("read"));
                if(isRead == 0){
                	 System.out.println("sb="+sb.toString());
                }
               
			}
			
			System.out.println("sms database changed");
			super.onChange(selfChange);
		}
		
	}

抱歉!评论已关闭.