获取未接来电及新短信的小栗子(主要使用ContentObserver类)

1.ContentObserver简单介绍:
    ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。


2.编程步骤:
    ①创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法(当观察到的Uri发生变化时,回调该方法去处理),在这个方法中去做自己需要的功能
    ②利用context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者
    ③由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要时,需要手动的调用unregisterContentObserver()去取消注册。  

  

3.下边的是自己写的一个得到未接来电的栗子:

public class MainActivity extends AppCompatActivity {
    public static int PHONE_NUM;
    private final ContentObserver mContactsObserver = new ContactsContentObserver();
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, mContactsObserver);
    }

    @Override
    protected void onDestroy() {
        getContentResolver().unregisterContentObserver(mContactsObserver);
        super.onDestroy();
    }

    private class ContactsContentObserver extends ContentObserver {
        public ContactsContentObserver() {
            super(new Handler());
        }
        @Override
        public void onChange(boolean selfChange) {    //当观察到的Uri发生变化时,回调该方法去处理
            Log.e("111","进入检测函数");
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    UpdateUnAnsweredCalls(getApplicationContext());
                    mHandler.sendEmptyMessage(0);
                }
            });
            super.onChange(selfChange);
        }
    }

    private void UpdateUnAnsweredCalls(Context context) {
        Cursor cursor = null;
        Log.e("111","进入处理函数");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED) {
            try {
                cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, null,
                        "type = 3 and new = 1", null, null);
                if (null != cursor) {
                    PHONE_NUM = cursor.getCount();
                    String s = Integer.toString(PHONE_NUM);
                    Log.e("111","未接来电数目:"+s);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
            return;
        }

    }
}


打印结果如下,用户点掉手机未接来电后立马更新来电数量到零:


4.详细了解ContentObserver的文章:点击打开链接


5.短信和来电的做法类似,可以直接看我自己写的demo,最后附上自己的源码,下载地址:点击打开链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值