Отправленное смс наблюдателем выполняется 3 раза - PullRequest
5 голосов
/ 23 ноября 2011

Я определил следующую службу с наблюдателем отправленных сообщений.Проблема в том, что при отправке сообщения я чувствую, что он вызывается 3 раза методом onChange contentobserver.Know Кто-то знает, скажи мне, почему?

Спасибо

    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........");
        }
    }

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

Что вы хотите сделать, это проверить _id последнего элемента в content://sms/sent URI внутри onChange. Вам нужно сохранить предыдущий _id (возможно, в статической глобальной переменной) и сравнить его с _id последнего элемента (cursor.moveToLast()) курсора после запроса на content://sms/sent. Если _id совпадает, вы можете игнорировать вызов onChange. Я полагаю, что это многократное обращение к onChange связано с перемещением смс из папки в папку во время отправки - исходящие, отправленные элементы, некоторая другая «невидимая папка» (которую мы не можем точно знать, поскольку эта конкретная функция действительно ДЕЙСТВИТЕЛЬНО нуждается в надлежащей документация). Поскольку вы не можете прослушивать более конкретный Uri, чем content://sms/sent, вам придется применять эту проверку для _id каждый раз, когда вы хотите обнаружить отправляемое смс.

Если предыдущий _id отличается от того, который указан в вашей статической глобальной переменной, то вам отправляется смс.

4 голосов
/ 23 ноября 2011

Вы сохранили Observer для базы данных SMS через URI.поэтому при отправке сообщения база данных обновляется, а 3 столбца этой таблицы обновляется.поэтому он уведомит наблюдателя о каждом из них.поэтому он вызывается столько раз, сколько обновляются данные таблицы.

...