我已经通过发送消息的观察者定义了以下服务。问题是,当发送消息时,我感觉到在contentobserver的onChange方法上被调用了3次。 ¿有人知道告诉我为什么?
由于
public class DSMSService extends Service {
private static final String CONTENT_SMS = "content://sms";
private class MyContentObserver extends ContentObserver {
ContentValues values = new ContentValues();
int threadId;
public MyContentObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.v(TAG, "****************************** SMS change detected *************************************");
Log.v(TAG, "Notification on SMS observer");
// save the message to the SD card here
Uri uriSMSURI = Uri.parse("content://sms");
Cursor cur = getBaseContext().getContentResolver().query(uriSMSURI, null, null, null, null);
// this will make it point to the first record, which is the last SMS sent
cur.moveToNext();
String content = cur.getString(cur.getColumnIndex("body"));
Log.v(TAG, "content: " + content);
}
@Override
public boolean deliverSelfNotifications() {
return false;
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.v(TAG, "starting........");
MyContentObserver contentObserver = new MyContentObserver();
ContentResolver contentResolver = getBaseContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms"),true, contentObserver);
DAO = new DAOaBlackList(getBaseContext());
}
@Override
public void onDestroy() {
Log.d(TAG, "stopping........");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(TAG, "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startid) {
Log.v(TAG, "onStart........");
}
}
答案 0 :(得分:7)
您要做的是检查onChange中_id
uri中最后一项的content://sms/sent
。在查询cursor.moveToLast()
之后,您需要存储先前的_id(可能在静态全局变量中)并将其与光标的最后一项(content://sms/sent
)的_id进行比较。如果_id
相同,您可以选择忽略对onChange的调用。这个多次调用onChange我认为是由于短信在发送 - 发件箱,发送物品,其他一些“隐形文件夹”(我们无法确切知道什么,因为这个特殊功能真正需要正确)时从一个文件夹移动到另一个文件夹文档)。由于你不能听到比content://sms/sent
更具体的Uri,你每次想要检测正在发送的短信时都必须对_id执行此检查。
如果之前的_id
与静态全局变量中的{{1}}不同,那么您将发送短信。
答案 1 :(得分:4)
您已通过URI保留了SMS数据库的Observer。因此,无论何时发送消息,数据库都会更新,并且该表的3列正在更新。所以它会通知观察者他们每个人。所以当表数据更新时,它会被调用多次。