Я определил следующую службу с наблюдателем отправленных сообщений. Проблема в том, что при отправке сообщения я чувствую, что он вызван 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 столбца этой таблицы обновляется. Поэтому он будет уведомлять наблюдателя о каждом из них. Поэтому он вызывается столько раз, сколько данные таблицы обновляются.