初心者Android、ContentProviderのデータ変更を監視(五十七)

2661 ワード

アプリケーションでContentProviderの変更をリスニングして応答する必要がある場合があります.ContentObserverクラスを利用します.
ContentProviderで実装、insert、delete、updateメソッドのいずれかにかかわらず、プログラムはgetContext()を呼び出す.getContentResolver().notifyChange(uri,null);
この行のコードは、ContentProviderが共有するデータが変更されたことを示すUriに登録されているすべてのリスナーに通知するために使用できます.
ContentProviderデータの変更をリスニングするリスナーはContentObserverクラスを継承し、そのベースクラスで定義されたonChangeメソッドを書き換える必要があります.このonChangeは、リスニングされたContentProviderが共有するデータが変更されるとトリガーされます.
指定されたContentProviderのデータ変化を傍受するには、ContentResolverを介して指定UriにContentObserverリスナーを登録する必要がある.
リスナーを登録するには、次の方法を使用します.
registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer)
notifyForDescents:このパラメータがtrueに設定されている場合、Uriがcontent://abcあ、ではUriはcontent://abc/xyz, content://abc/xyz/fooのデータが変更されると、リスナーもトリガーされます.パラメータがfalseの場合、content://abcのデータが変更されると、Listenerがトリガーされます.
次に、傍受システムのメールを例に、次の図をシミュレーションしてメールを送信します.
上にはhelloというメールがあります.次にリスナーを起動してlogcatでメールに関する情報を印刷します.
次はコード
package WangLi.IO.MonitorSms;

import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class MonitorSms extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // content://sms          
        this.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, 
        		new SmsObserver(new Handler()));
    }
    //      ContentObserver   
    private final class SmsObserver extends ContentObserver
    {

		public SmsObserver(Handler handler) {
			super(handler);
			// TODO Auto-generated constructor stub
		}
    	public void onChange(boolean selfChange)
    	{
    		//         (                )
    		Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"), 
    				null, null, null, null);
    		//         ,             
    		while(cursor.moveToNext())
    		{
    			StringBuilder sb = new StringBuilder();
    			//         
    			sb.append("address=").append(
    					cursor.getString(cursor.getColumnIndex("address")));
    			//      
    			sb.append(";subject=").append(
    					cursor.getString(cursor.getColumnIndex("body")));
    			//        
    			sb.append(";time=").append(
    					cursor.getLong(cursor.getColumnIndex("date")));
    			System.out.println("Has Sent SMS:::" + sb.toString());
    		}
    	}
    }
}