Ссылаемый SMS-наблюдатель выполняет 3 раза

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

благодаря

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

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

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

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

Intereting Posts
Какая длина – токен устройства iOS и Androids Поставщик плавного местоположения не получает местоположение, если GPS не включен Commons-Io Duplicate Entry Error с использованием Robospice и Android Studio RecyclerView.Adapter.notifyItemChanged () никогда не передает полезную нагрузку onBindViewHolder () Открыть внутренний фрагмент камеры Как связаться с Wi-Fi включенной камерой ANDROID-Не удалось выделить память: 1455 Stacked панель вкладок ActionBar, не заполняющая родительскую Использование FragmentTransaction с помощью DialogFragment Диалоговое окно LocationSettingsRequest для включения GPS-onActivityResult () пропущено Как мы можем скрыть включение макета программно в Android? Размер изображения, возвращаемого Aviary, меньше оригинала Сплит-события движения – одновременное принятие входов к нескольким представлениям Android-html-вход теряет фокус при открытии программной клавиатуры (ASP.net) Получение версии SDK для Android SDK из командной строки