内容观察者类的Onchange函数被多次调用

时间:2011-06-13 05:16:57

标签: android

我正在使用contentObserver来监控sms content provider的内容,我已经为调试添加了Log.d()标记,logcat中的标记正在被更多地看到不止一次意味着onchange() id不止一次被调用,我该如何防止这种情况发生。我已经在后台运行的服务中实现了观察者。 这是代码

package com.messageHider;

 import android.app.Service;
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.IBinder;
 import android.util.Log;
 import android.widget.Toast;

 public class smsSentService extends Service {
ContentResolver contentResolver;
Uri uri=Uri.parse("content://sms/");
Handler handler;
@Override
public IBinder onBind(Intent arg0) {
    return null;
}
@Override
public void onCreate() {
    contentResolver=getContentResolver();
    contentResolver.registerContentObserver(uri, true, new contentObserver(handler));
    Log.d("SENTSERVICE", "Service created");
    super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
    Log.d("SENTSERVICE", "Service started");
    super.onStart(intent, startId);
}
@Override
public void onDestroy() {
    super.onDestroy();
}
public class contentObserver extends ContentObserver
{
    public contentObserver(Handler handler) {
        super(handler);

    }
    @Override
    public void onChange(boolean selfChange) {
        Cursor cursor=contentResolver.query(uri, null, null, null, null);
        cursor.moveToFirst();
        String type=cursor.getString(cursor.getColumnIndex("type"));
        Log.d("THEMESSAGE", type);
        super.onChange(selfChange);
    }
}

}


3 个答案:

答案 0 :(得分:1)

只是一个建议:在onResume方法上注册内容观察者并在onPause上注销它。

答案 1 :(得分:0)

我正在使用内容观察者来观看出站短信,并注意到如果您尝试从模拟器发送出站短信,您实际上会看到3个实例,因为它试图重新发送文本但是失败了。您是否也看到了入站短信?

如果仅用于出站短信,请查看短信状态字段。 -1值表示失败。

答案 2 :(得分:0)

您需要覆盖deliverSelfNotifications()以返回true。

class contentObserver extends ContentObserver { private Context mContext;

    public contentObserver(Handler handler) {
        super(handler);

    }

    @Override
    public void onChange(boolean selfChange) {
        Cursor cursor=contentResolver.query(uri, null, null, null, null);
        cursor.moveToFirst();
        String type=cursor.getString(cursor.getColumnIndex("type"));
        Log.d("THEMESSAGE", type);
        super.onChange(selfChange);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }
}