ContentProvider ContentObserver

本章节我们来学习如何在 Android 使用 ContentObserver 监听 ContentProvider 的变化

通过 ContentObserver 监听 ContentProvider 数据变化的步骤如下

  1. 自定义一个类继承 ContentObserver

  2. 重写 onCreate() 方法

  3. 调用 getContentReslover().registerContentObserver() 注册监听器

范例

我们写一个范例来监听 相册,如果 相册 有新的内容增加则弹出提示

你可以可以根据自己的需求将 Activtiy 改做 Service 从而在后台做这种事情


  1. 创建一个 空的 Android 项目 cn.twle.android.ContentObserver

  2. 修改 activity_main.xml 添加一个 <TextView>

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:padding="16dp"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/sms_show"
            android:layout_width="match_parent" 
            android:layout_height="wrap_content" 
            android:text="正在等待短信到来,要不你现在发一条"/>
    </LinearLayout>
    
  3. 修改 MainActivity.java

    package cn.twle.android.contentobserver;
    
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        TextView sms_show;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            sms_show = findViewById(R.id.sms_show);
    
            // 1.  content://sms 的数据改变注册监听器
    
            getContentResolver().registerContentObserver(Uri.parse("content://sms"), true,
                    new MsObserver(new Handler()));
        }
    
        private final class MsObserver extends ContentObserver {
    
            public MsObserver(Handler handler) {
                super(handler);
            }
    
            @Override
    
            public void onChange(boolean selfChange) {
    
                //查询发送箱哩的短信(处于正茌发送状态的信皂放在发送箱)
    
                Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"),
                        null, null, null, null);
    
                //遍历查询得到结果集.就可以获得用户正在发送的短信了
    
                StringBuilder sb = new StringBuilder();
    
                while (cursor.moveToNext()) {
    
                    //发送地址
                    sb.append("\naddress:").append(cursor.getString(cursor.getColumnIndex("address")));
    
                    //短信标題
                    sb.append("\nsubject:").append(cursor.getString(cursor.getColumnIndex("subject")));
    
                    //短信内容
                    sb.append("\nbody:").append(cursor.getString(cursor.getColumnIndex("body")));
    
                    //短信发送时间
                    sb.append("\ntime:").append(cursor.getLong(cursor.getColumnIndex("date")));
    
                }
    
                sms_show.setText("收到用户发来的信息:\n" + sb.toString());
            }
        }
    }
    
  4. 修改 AndroidManifest.xml 添加读取短信权限

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

运行之后没有内容,对的,因为,读取短信内容已经不能这么用了

参考文档

  1. Android ContentProvider

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.