ContentObserve的基本使用方法

    在Android中有时候会用到对系统自带的数据的数据变化进行监听,例如接收短信,拨打电话等,我记得我以前是通过注册广播来进行短信的监听的,可以通过设置广播action=“android.provider.Telephony.SMS_RECEIVED”,然后把广播的优先级设置成最高的,这样可以在接收到广播后根据意向决定是否需要拦截短信。只是这个过程对于我只想知道短信变化了没有,谁发来的,这点信息来说感觉有些麻烦了。

   不过今天我接触到了ContentObserve这个类,他是系统提供的一个内容监听者,他可以很方便的帮我们监听例如短信的变化信息等,当然了,他并不能实现拦截短信的功能。

   接下来我们来看一下这个类:

      public abstract class ContentObserver
   这是类的声明,很显然他是一个抽象类,我们想要使用它务必需要自己写个类来继承他

   接下来我们看一下这个类中可以重写的方法:

   public boolean deliverSelfNotifications() {
        return false;
    }

   public void onChange(boolean selfChange) {
        // Do nothing.  Subclass should override.
    }

   public void onChange(boolean selfChange, Uri uri) {
        onChange(selfChange);
    }
说实话我只用到了第二个方法,对于一个方法API的解释里也只是说了返回值的true or false表示他是否对接收到的

self-change notifications
感兴趣,第三个方法API给出的解释是可以配合第二个方法使用,先调用第二个方法,然后在第二个方法中调用第三个方法,在第三个方法中来处理变化,如果感兴趣可以去看看源码,虽然我觉得没必要。

   接下来直接上demo:

   

package com.example.contentobserve;

import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

public class MainActivity extends Activity {

    private MyContentObserver observer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("ContentObserver","onCreate");

        init();
    }

    private void init() {
        Log.d("ContentObserver","init");
        Uri uri = Uri.parse("content://sms/");
        observer = new MyContentObserver(new Handler());
        Log.d("ContentObserver","注册了短信的内容监听者");
        //uri是你需要监听的内容提供者的uri,第二个参数代表是否接收你写的uri的派生uri的变化信息,第三个参数就是内容监听者了
        getContentResolver().registerContentObserver(uri,true,observer);
    }

    class MyContentObserver extends ContentObserver {

        /**
         * Creates a content observer.
         *
         * @param handler The handler to run {@link #onChange} on, or null if none.
         */
        public MyContentObserver(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            Log.d("ContentObserver","短信改变了");
            Uri uri = Uri.parse("content://sms/outbox");
            Cursor cursor = getContentResolver().query(uri,new String[]{"_id","body","address"},
                    null,null,"_id desc");//查询发件箱中的短信,只要最新的
            if(cursor != null && cursor.moveToFirst()) {
                String body = cursor.getString(cursor.getColumnIndex("body"));
                String address = cursor.getString(2);
                Log.d("ContentObserver","body = "+body+";address = "+address);//打印获取到的短信内容
            }
            cursor.close();//游标使用后关闭
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("ContentObserver","解绑了短信的内容监听者");
        getContentResolver().unregisterContentObserver(observer);
    }
}

可以直接复制代码,运行,看看logcat输出。使用方法就是打开软件,让他在后台运行,然后发短信就可以了。

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值