ContentObserver


1. ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理.

1)注冊ContentObserver方法

public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

功能:為指定的Uri注冊一個ContentObserver派生類實例,當給定的Uri發生改變時,回調該實例對象去處理。

uri表示需要觀察的Uri

notifyForDescendents false 表示精確匹配,即只匹配該Uri true 表示可以同時匹配其派生的Uri

2)取消注冊ContentObserver方法

public final void unregisterContentObserver(ContentObserver observer)

功能:取消對給定Uri的觀察

參數: observer ContentObserver的派生類實例

2.ContentObserver類介紹

構造方法 ContentObserver(Handler h)

void onChange(boolean selfChange) 功能:當觀察到的Uri發生變化時,回調該方法去處理。所有ContentObserver的派生類都需要重載該方法去處理邏輯。

3.觀察特定Uri的步驟如下:

1、創建我們特定的ContentObserver派生類,必須重載父類構造方法,必須重載onChange()方法去處理回調后的功能實現

2、利用context.getContentResolover()ContentResolover對象,接着調用registerContentObserver()方法去注冊內容觀察者

3、在不需要時,需要手動的調用 unregisterContentObserver()去取消注冊。

例子:監聽短信內容變化

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);

        //第二個參數,true表示觀察所有有關短信的

        cr.registerContentObserver(Uri.parse("content://sms"), true, smsObserver);

        //content://sms/inbox //收件箱

        //content://sms/sent //已發送

        //content://sms/draft //草稿箱

        //content://sms/outbox //發件箱

        //content://sms/failed //失敗短信

        //content://sms/queued //代發隊列

    }

}


//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()){

            //發件人手機號碼

            String sendNumber = c.getString(

                    c.getColumnIndex("address"));

            //信息內容

            String body = c.getString(c.getColumnIndex("body"));

            //readType 表示是否已經讀

            int hasRead = c.getInt(c.getColumnIndex("read"));

            if(hasRead == 0){//表示短信未讀

                System.out.println("短信未讀"+sendNumber);

            }

            sb.append(sendNumber+":"+body+"\n");

        }

        handler.obtainMessage(100,sb.toString()).sendToTarget();

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM