Android 短信发送观察员执行3次

Android 短信发送观察员执行3次,android,sms,contentobserver,Android,Sms,Contentobserver,我已经用发送消息的观察者定义了以下服务。问题是,在发送消息时,我感觉contentobserver的onChange方法调用了3次。有人知道为什么吗 谢谢 public class DSMSService extends Service { private static final String CONTENT_SMS = "content://sms"; private class MyContentObserver extends ContentOb

我已经用发送消息的观察者定义了以下服务。问题是,在发送消息时,我感觉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........");
        }
    }

您要做的是检查
中最后一项的
\u id
content://sms/sent
onChange中的uri。查询
content://sms/sent
。如果
\u id
相同,则可以选择忽略对onChange的调用。我认为,对onChange的多次调用是由于短信在发送过程中从一个文件夹移动到另一个文件夹——发件箱、已发送邮件、其他一些“不可见文件夹”(我们不知道具体是什么,因为这一特定功能确实需要适当的文档)。因为您无法侦听比
content://sms/sent
每次您想要检测发送的sms时,都必须执行此id检查


如果前面的
\u id
与静态全局变量中的id不同,则您将发送一条sms。

您已通过URI保留sms数据库的观察者。因此,无论何时发送消息,数据库都会更新,并且该表的第3列也会更新。因此,它将通知每一位观察员。因此,它被调用的次数与表数据被更新的次数相同。

这一行是什么意思:DAO=newdaoablacklist(getBaseContext())??