短信发送观察者执行3次

ita*_*ika 5 sms android contentobserver

我已经通过发送消息的观察者定义了以下服务.问题是,当发送消息时,我感觉到在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........");
        }
    }
Run Code Online (Sandbox Code Playgroud)

jos*_*hus 7

你想要做的是检查onChange里面uri _id中的最后一项content://sms/sent.您需要存储之前的_id(可能在静态全局变量中),并cursor.moveToLast()在查询后将其与光标的最后一项()的_id进行比较content://sms/sent.如果_id相同,则可以选择忽略对onChange的调用.到的onChange由于该短信多次调用我相信是从文件夹移动过程中发送到文件夹-发件箱,已发送的邮件,其他一些"看不见的文件夹"(这是我们不能确切地知道,因为这个特殊的功能,真的真的需要适当文档).因为你不能听一个更具体的Uri而不是content://sms/sent你每次想要检测正在发送的短信时都要对_id进行检查.

如果前_id一个与静态全局变量中的不同,那么您将发送一个短信.