Android 四大组件学习之ContentProvider五

上几节学习了ContentProvider的实际用途,读取短信,插入短信,读取联系人,插入联系人等。 本节课在学习ContentProvider的观察者。

在生活中有第三方的软件,比如什么短信软件,此短信软件是替代了系统中自带的短信软件。当然可读取短信就是利用的ContentProvider,但是此等软件为何能实时的把接受的短信显示出来呢?  这就用到我们的内容观察者。

什么是内容观察者呢?  就是一直在观察系统是否有新短信,如果有新短信就会提示第三方软件赶快去数据库中取短信信息。这样就能实时的获取系统的短信了

举例说明:

public class MyContentObserverActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_readcontact);
        /**
         * uri: 监听的是那个uri上的内容提供者的通知
         * true:代表的是"content://sms", content://sms/inbox", "content://sms/outbox"都可以匹配
         * false: 代表的是: "content://sms"只匹配这个
         * 当数据改变后就会调用这个匿名类中的onchange方法
         */
        getContentResolver().registerContentObserver(Uri.parse("content://sms"), true,
                new ContentObserver(new Handler()) {
            
                @Override
                public void onChange(boolean selfChange) {
                    // TODO Auto-generated method stub
                    //super.onChange(selfChange);
                    Log.i("MyContentObserverActivity", "有新消息了!!!");
                    ContentResolver cResolver = getContentResolver();
                    /**
                     * uri: 是短信提供者的url,可以通过查看源码获得
                     * projection:需要查询的几个字段,关心那个查询按个就行
                     * 按日期排序,取最后一个
                     */
                    Cursor cursor = cResolver.query(Uri.parse("content://sms"), new String[]{"address", "date", "type", "body"},
                            null, null, "date");
                    if(cursor.moveToLast())
                    {
                        String address = cursor.getString(cursor.getColumnIndex("address"));
                        String date = cursor.getString(cursor.getColumnIndex("date"));
                        String type = cursor.getString(cursor.getColumnIndex("type"));
                        String body = cursor.getString(cursor.getColumnIndex("body"));
                        
                        Log.i("ReadMessageActivity", address + ";" + date + ";" + type + ";" + body);
                    }
                }
        });
    }
}

然后你可以在模拟器上发送一条短信,这时候你就会看到控制台有短信信息输出

这样就取到最新的消息了。

今天就到这里。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 13:50:05

Android 四大组件学习之ContentProvider五的相关文章

Android 四大组件学习之ContentProvider一

ContentProvider作为四大组件之一,那它存在一定是有原因的? 那为什么引用ContentProvider呢?  我们先看一个例子. 大家在生活中用手机,比如你按了360手机管家, 其中360手机管家就有一个短信,通话记录,联系人备份的功能.那手机里的短信,联系人都是存放在数据库中的 比如联系人的信息是存放在contacts2.db中.既然数据是存放在数据库中的,那360手机管家就必须拿到这个数据.但是contac2.db对别的用户是没有权限的.那360是如何拿到手机联系人这些信息呢?

Android 四大组件学习之ContentProvider二

上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是检验真理的唯一标准. 那我们就開始行动吧 第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider public class MyContentProvider extends ContentProvider { @Override public int d

Android 四大组件学习之ContentProvider三

上节课学习如何自己创建一个ContentProvider,以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的,读取系统的短信内容. 根据上节知道,既然要读取系统的短信,那就得先找到系统的短信在那里? 先找到短信数据库所在的问题,然后导出,查看里面的内容 既然已经分析好了,我们需要什么,不需要什么. 当然还需要知道短信提供者给第三方的URL.这个可以通过Android源码查看. 那我们就写一个程序,读取系统

Android 四大组件学习之ContentProvider四

上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. 然后导出,查看数据库中的内容 上图就是怎样到数据库中找打系统的联系人数据,(看起来图画的有点乱,希望能看懂吧) 既然知道怎样能到系统的数据库找到数据.那我们就開始写代码实现吧: public class ReadContactActivity extends Activity { @Override p

Android 四大组件学习之Service五

本节学习IntentService, 可能就有人问了, 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentService呢? 带着这两个问题,我们先来看一个例子: 我们新建一个MyIntentService例子: public class MyIntentService extends IntentService { private int count = 5; public MyIntentService() {

android四大组件学习总结以及各个组件示例(1)

android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. (4)Activity生命周期>什么是

Android 四大组件学习之Activity一

Activity是Android四大组件中最基础也是最常用的组件之一.Activity作为一个应用程序组件,提供了一个与用户交互的界面.可以这么说Activity是和用户操作有密切相关的的,常用来负责与用户交互,可以通过setContentView来显示组件. 今天我们学习如何去创建一个Activity 第一步: 创建一个Android Application Project, 填入应用名称,工程名称,包名 点击Next下一步:下面的选择都是默认的. 直到 你就可以选择一个Activity进行创

Android 四大组件学习之BroadcastReceiver一

本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比如在现实社会中,以前每个人家都有一台收音机,这可就可以去接受广播发出来的消息.大家都知道,程序世界也是参照的显示生活设计出来的,那在Android系统中也引入了广播这个概念.那在Android系统中广播有什么作用呢? 举个例子:比如你正在玩游戏或者看视频突然手机电量过低,这时候就会弹出一个框,提醒您手机电量过低,请充电的提示.其实电量改变就是一种广播类型,当电量过低时,系统就会发生一条广播,这时候正在运行的程序就会收

Android四大组件之一:ContentProvider(内容提供者)

Android中还提供了名为ContentProvider(内容提供者),可以向其他应用提供数据,但不常用,除非是同一公司开发的App,可以向不同应用提供数据.虽然为Android的四大组件之一,但用法并不复杂. 建立一个Activity,设置三个Button,分别用于手机相册,Mp3,Mp4的数据的获取.在这里用的是内部类监听方式,不要忘了注册监听. package com.example.administrator.jreduch09.contentprovider; import andr