今天介绍一下怎么监听ContentProvider的数据改变,主要的方法是:getContext().getContentResolver().notifyChange(uri,null),这行代码是通知所有注册在该Uri上的监听者,该ContentProvider所共享的数据发生了改变。
监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写该基类所定义的onChange(boolean selfChange)方法----当它所监听的ContentProvider的数据发生改变时,该onChange将会被触发。
为了监听指定ContentProvider的数据变化,需要通过ContentProvider向指定Uri注册ContentObserver监听器,方法:
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)。
说了这么多上个实例:
1 public class MonitorSms extends Activity 2 { 3 @Override 4 public void onCreate(Bundle savedInstanceState) 5 { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 //为content://sms的数据改变注册监听器 9 getContentResolver().registerContentObserver( 10 Uri.parse("content://sms") 11 , true, new SmsObserver(new Handler())); 12 } 13 // 提供自定义的ContentObserver监听器类 14 private final class SmsObserver extends ContentObserver 15 { 16 public SmsObserver(Handler handler) 17 { 18 super(handler); 19 } 20 public void onChange(boolean selfChange) 21 { 22 // 查询发送箱中的短信(处于正在发送状态的短信放在发送箱) 23 Cursor cursor = getContentResolver().query( 24 Uri.parse("content://sms/outbox") 25 , null, null, null, null); 26 // 遍历查询得到的结果集,即可获取用户正在发送的短信 27 while (cursor.moveToNext()) 28 { 29 StringBuilder sb = new StringBuilder(); 30 // 获取短信的发送地址 31 sb.append("address=").append( 32 cursor.getString(cursor.getColumnIndex("address"))); 33 // 获取短信的标题 34 sb.append(";subject=").append( 35 cursor.getString(cursor.getColumnIndex("subject"))); 36 // 获取短信的内容 37 sb.append(";body=").append( 38 cursor.getString(cursor.getColumnIndex("body"))); 39 // 获取短信的发送时间 40 sb.append(";time=").append( 41 cursor.getLong(cursor.getColumnIndex("date"))); 42 System.out.println("Has Sent SMS:::" + sb.toString()); 43 } 44 } 45 } 46 }