ContentProvider ContentObserver
本章节我们来学习如何在 Android 使用 ContentObserver
监听 ContentProvider
的变化
通过 ContentObserver 监听 ContentProvider 数据变化的步骤如下
-
自定义一个类继承
ContentObserver
-
重写
onCreate()
方法 -
调用
getContentReslover().registerContentObserver()
注册监听器
范例
我们写一个范例来监听 相册,如果 相册 有新的内容增加则弹出提示
你可以可以根据自己的需求将 Activtiy
改做 Service
从而在后台做这种事情
-
创建一个 空的 Android 项目
cn.twle.android.ContentObserver
-
修改
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>
-
修改
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()); } } }
-
修改
AndroidManifest.xml
添加读取短信权限<uses-permission android:name="android.permission.READ_SMS" />
运行之后没有内容,对的,因为,读取短信内容已经不能这么用了