android之ContentObserver內容觀察者的使用
阿新 • • 發佈:2019-01-21
在跟著一個教程做手機衛士的時候,裡面用到了ContentObserver,以前沒接觸過,根據網上的資料整理了一下,還算明白。
ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的資料庫的變化,繼而做一些相應的處理,它類似於
資料庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。
(1)註冊:
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)。
功能:為指定的Uri註冊一個ContentObserver派生類例項,當給定的Uri發生改變時,回撥該例項物件去處理。
(2)解除安裝: public final void unregisterContentObserver(ContentObserver observer)
功能:取消對給定Uri的觀察
下面是一個監聽收信箱的Demo
首先是一個監聽類:
package jason.observer; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; public class SMSContentObserver extends ContentObserver { Context context; Handler handler; public SMSContentObserver(Context c, Handler handler) { super(handler); // TODO Auto-generated constructor stub this.context = c; this.handler = handler; } @Override public void onChange(boolean selfChange) { // TODO Auto-generated method stub super.onChange(selfChange); Uri outMMS = Uri.parse("content://sms/inbox"); //desc 降序 asc 升序 Cursor cursor = context.getContentResolver().query(outMMS, null, null, null, "date ASC"); if(cursor != null){ System.out.println("the number is " + cursor.getCount()); StringBuilder builder = new StringBuilder(); while(cursor.moveToNext()){ builder.append("發件人資訊:" + cursor.getString(cursor.getColumnIndex("address"))); builder.append("資訊內容:"+cursor.getString(cursor.getColumnIndex("body"))+"\n"); } cursor.close(); String builder2 = builder.toString(); handler.obtainMessage(1, builder2).sendToTarget(); } } }
(2)註冊監聽類的acitivity
package jason.observer; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public class ObserverActivity extends Activity { SMSContentObserver contentObserver; TextView tv_number; TextView tv_content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observer); tv_content = (TextView) findViewById(R.id.tv_content); tv_number = (TextView) findViewById(R.id.tv_number); contentObserver = new SMSContentObserver(this, handler); Uri uri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(uri, true, contentObserver); } Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: String sb = (String) msg.obj; tv_content.setText(sb); break; default: break; } }; }; }
最後別忘記了加入 讀取訊息的許可權
<uses-permission android:name="android.permission.READ_SMS"/>
作者:jason0539