1. 程式人生 > >內容觀察者使用

內容觀察者使用

1.使用ContentObserver監聽ContentProvider中資料的變化

2.(PPT中內容)

如果ContentProvider的訪問者需要知道ContentProvider中的資料發生了變化,可以在ContentProvider 發生資料變化時呼叫getContentResolver().notifyChange(uri, null)來通知註冊在此URI上的訪問者,例子如下:
public class PersonContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
getContext().getContentResolver().notifyChange(uri, null);
}
}
如果ContentProvider的訪問者需要得到資料變化通知,必須使用ContentObserver對資料(資料採用uri描述)進行監聽,當監聽到資料變化通知時,系統就會呼叫ContentObserver的onChange()方法:
getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"),
        true, new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
public PersonObserver(Handler handler) {
super(handler);
 }
public void onChange(boolean selfChange) {
   //此處可以進行相應的業務處理
}
}


1.      監聽資料變化

2.      發件箱的uri: content://sms/outbox

3.      加許可權;

4.      一旦註冊內容觀察者,就算關閉應用也會存在手機中,除非解除安裝應用和程序被關掉

守護程序:一旦關閉程序,就另開一個,不斷迴圈;

監聽系統簡訊

.
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// 監聽系統簡訊
		
		ContentResolver resolver = getContentResolver();
		
		// 註冊一個內容觀察者觀察簡訊資料庫
		resolver.registerContentObserver(Uri.parse("content://sms/"), true, new MyContentObserver(new Handler()));
	}
	
	/**
	 * @author andong
	 * 內容觀察者
	 */
	class MyContentObserver extends ContentObserver {

		private static final String TAG = "MyContentObserver";

		public MyContentObserver(Handler handler) {
			super(handler);
		}

		/**
		 * 當被監聽的內容發生改變時回撥
		 */
		@Override
		public void onChange(boolean selfChange) {
			Log.i(TAG, "簡訊改變了");
			Uri uri = Uri.parse("content://sms/outbox");	// 發件箱的uri
			
			// 查詢發件箱的內容
			Cursor cursor = getContentResolver().query(uri, new String[]{"address", "date", "body"}, null, null, null);
			if(cursor != null && cursor.getCount() > 0) {
				
				String address;
				long date;
				String body;
				while(cursor.moveToNext()) {
					address = cursor.getString(0);
					date = cursor.getLong(1);
					body = cursor.getString(2);
					
					Log.i(TAG, "號碼: " + address + ", 日期: " + date + ", 內容: " + body);
				}
				cursor.close();
			}
		}
	}
}
觀察監聽自己定義的內容提供者;

。。。。。。。。。。。。。。。。。