1)注冊(cè)ContentObserver方法
創(chuàng)新互聯(lián)建站專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,成都移動(dòng)機(jī)房,成都移動(dòng)機(jī)房,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
功能:為指定的Uri注冊(cè)一個(gè)ContentObserver派生類實(shí)例,當(dāng)給定的Uri發(fā)生改變時(shí),回調(diào)該實(shí)例對(duì)象去處理。
uri表示需要觀察的Uri
notifyForDescendents 為false 表示精確匹配,即只匹配該Uri。 為true 表示可以同時(shí)匹配其派生的Uri。
2)取消注冊(cè)ContentObserver方法
public final void unregisterContentObserver(ContentObserver observer)
功能:取消對(duì)給定Uri的觀察
參數(shù): observer ContentObserver的派生類實(shí)例
2.ContentObserver類介紹
構(gòu)造方法 ContentObserver(Handler h)
void onChange(boolean selfChange) 功能:當(dāng)觀察到的Uri發(fā)生變化時(shí),回調(diào)該方法去處理。所有ContentObserver的派生類都需要重載該方法去處理邏輯。
3.觀察特定Uri的步驟如下:
1、創(chuàng)建我們特定的ContentObserver派生類,必須重載父類構(gòu)造方法,必須重載onChange()方法去處理回調(diào)后的功能實(shí)現(xiàn)
2、利用context.getContentResolover()獲ContentResolover對(duì)象,接著調(diào)用registerContentObserver()方法去注冊(cè)內(nèi)容觀察者
3、在不需要時(shí),需要手動(dòng)的調(diào)用 unregisterContentObserver()去取消注冊(cè)。
例子:監(jiān)聽(tīng)短信內(nèi)容變化
在Activity中:
public class Day0108_contentobserverActivity extends Activity {
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 100:
String body= (String) msg.obj;
TextView tv= (TextView) findViewById(R.id.tv);
tv.setText(body);
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ContentResolver cr= getContentResolver();
ContentObserver smsObserver= new SmsContentObserver(this,handler);
//第二個(gè)參數(shù),true表示觀察所有有關(guān)短信的
cr.registerContentObserver(Uri.parse("content://sms"), true, smsObserver);
//content://sms/inbox//收件箱
//content://sms/sent//已發(fā)送
//content://sms/draft//草稿箱
//content://sms/outbox//發(fā)件箱
//content://sms/failed//失敗短信
//content://sms/queued//代發(fā)隊(duì)列
}
}
//SmsContentObserver代碼如下:public class SmsContentObserver extends ContentObserver {
private Handler handler;
private Context context;
public SmsContentObserver(Context context,Handler handler) {
super(handler);
this.handler = handler;
this.context = context;
}
@Override
public void onChange(boolean selfChange) {
ContentResolver cr= context.getContentResolver();
Cursor c= cr.query(Uri.parse("content://sms/inbox"), null, "0", null, "date desc");
StringBuilder sb= new StringBuilder();
while(c.moveToNext()){
//發(fā)件人手機(jī)號(hào)碼
String sendNumber= c.getString(
c.getColumnIndex("address"));
//信息內(nèi)容
String body= c.getString(c.getColumnIndex("body"));
//readType 表示是否已經(jīng)讀 int hasRead = c.getInt(c.getColumnIndex("read"));
if(hasRead == 0){//表示短信未讀
System.out.println("短信未讀"+sendNumber);
}
sb.append(sendNumber+":"+body+"
");
}
handler.obtainMessage(100,sb.toString()).sendToTarget();
}
}