7

Я знаю, что у вас есть соблазн отметить это дубликат, но подождите, давайте рассмотрим это снова с моими подробными (но неудачными) попытками.Метод Observer onChange уволен несколько раз

Стратегия 1: Алгоритм:Answer

  1. В первый раз OnChange обжигают, получить идентификатор строки обновленного

  2. В следующий раз, когда OnChange запускаемые снова получить идентификатор строки обновлен

  3. Соответствие ID

  4. Игнорируйте если же идентификатор

Проблема такого подхода заключается в том, что она является уязвимой к гонке условий. Если к моменту получения идентификатора обновленной строки onChange уволил за второй раз, этот алгоритм терпит неудачу. Это произошло из моего личного опыта при тестировании на медленных машинах или машин, работающих на максимальной мощности.

Стратегия 2: Алгоритм:Answer

Override deliverSelfNotifications() возвращает истинное.

Это кажется перспективным сначала, но не работает. кода я использовал для справки:

В Основной деятельности: OnCreate метод зарегистрироваться:

getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CtObserver(new Handler())); 

Тогда в отдельном классе:

package com.example.testproject; 

import android.database.ContentObserver; 
import android.os.Handler; 
import android.util.Log; 

/** 
* @author Time Traveller 
*/ 

public class CtObserver extends ContentObserver { 

public CtObserver(Handler handler) { 
    super(handler); 
} 

public boolean deliverSelfNotifications(){ 
    return true; 
} 

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    Log.e("onChange","Fired"); 
} 
} 

Почему вы должны внести свой вклад в этот ответ:
Запрос провайдера SMS-сообщений является единственным способом для приложений, отличных от по умолчанию, до capture мероприятие для Отправлено SMS. Но до сих пор я не нашел убедительного полностью функционального ответа для этого метода. Так что нам действительно нужно понять это!

Вопросы:

  1. Что такое функциональный (не приспособленный) способ просто зная, что SMS было написано в Content Provider только один раз?
  2. Каков правильный способ использования deliverSelfNotifications() в классе Content Observer?

Вам не нужно отвечать на все вопросы, просто сообщите нам все, что вы знаете.

ответ

1

deliverSelfNotifications() наиболее вероятно предназначен для разделения данных с изменениями презентации. Например, контент можно сортировать в вашем приложении, но нет необходимости, чтобы внешние приложения снова приобретали данные только потому, что они были отсортированы, так как большинство времени это будет неактуально (это приложение, вероятно, использует другое представление в любом случае). Другими словами - этот метод управляет, если вы хотите получать изменения, внесенные в контент самим поставщиком, которые могут или не могут фактически отражать изменения данных в значимых для вас способах использования.

Для его использования вам понадобится ContentObservable, использующая уведомления об изменениях.

Еще один вопрос, который я хотел бы предложить HashSet для хранения идентификаторов сообщений. С его помощью вы можете сравнить id сообщения с всеми обработанными сообщениями, а не только последним, тем самым устраняя проблему, о которой вы заявили.