ContentObserver не вызывается только в устройствах LG

Я программирую виджет, который должен обновляться каждый раз, когда я получаю пропущенный вызов. Для этого в методе onEnabled класса AppWidgetProvider я регистрирую ContentObserver. Код следующий:

@Override
public void onEnabled(Context context){
    this.mcco = new MissedCallsContentObserver(context);
    context.getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, this.mcco);
}

Код для класса MissedCallsContentObserver следующий:

package bembibre.coolstar.windowsmobilewidget.backend;

import bembibre.coolstar.windowsmobilewidget.backend.textproviders.CallsProvider;
import android.content.Context;
import android.database.ContentObserver;

public class MissedCallsContentObserver extends ContentObserver
{
    Context context;

    public MissedCallsContentObserver(Context context)
    {
        super(null);
        this.context = context;
    }

    @Override
    public void onChange(boolean selfChange)
    {
        try{
            Thread.sleep(1000);
        }
        catch(Exception e){

        }
        new CallsProvider(this.context).setData();
    }
}

Метод onChange вызывается автоматически каждый раз, когда на телефон поступает пропущенный вызов. Это работает на многих устройствах, на которых я тестировал. Но я также тестировал его на LG L5. Это единственное устройство, в котором это не работает. Почему? ContentObservers не совпадают на устройстве Samgung и на устройстве LG? В LG метод onChange никогда не вызывается. Я также хотел бы задать вопрос о моем отладчике eclipse. С моим телефоном Samsung он работает хорошо, но с Sony Xperia и LG, упомянутыми ранее, он отключается, когда хочет. Ничего не делая, отладчик внезапно отключается. Мой USB-провод идеален. Также порты USB моего компьютера и телефона. Почему отладчик отключается? В logcat не выдается ни исключение, ни сообщение об ошибке. Я не знаю, в чем проблема.


person user3289695    schedule 19.02.2014    source источник
comment
Samsung и LG сильно изменили код фреймворка. Проверяли ли вы какие-либо отчеты об ошибках LG по этой проблеме?   -  person Aadi Droid    schedule 19.02.2014
comment
Да, я сделал. Я ничего не нашел. А ContentObserver — очень простой механизм Android. Я не понимаю, как производители могут это изменить. Это будет означать, что в телефонах LG не будут работать многие приложения, например мое. Многим приложениям нужны ContentObservers.   -  person user3289695    schedule 19.02.2014
comment
Причиной моей проблемы может быть то, что я вызываю конструктор ContentObserver, передавая ему значение null вместо экземпляра Handler? Это единственная странная вещь, которую я вижу в своем коде.   -  person user3289695    schedule 19.02.2014
comment
Contentobserver отделен от данных, это contentprovider, который вызывает notifychange для любого contentresolver (после регистрации наблюдателей), LG, возможно, модифицировала провайдера, чтобы он не отправлял вызовы notoifychange, поэтому вы ничего не получаете в своем contentobserver. (хотя выглядит странно)   -  person Magnus    schedule 11.03.2014
comment
Вы хоть раз запускали приложение? Неявные намерения не принимаются приложениями, которые никогда не запускались.   -  person mach    schedule 11.03.2014
comment
Я думаю, это была моя проблема. Ниже я ответил сам себе. Мое приложение заработало, когда я переместил ContentObserver с AppWidgetProvider на липкое Service.   -  person user3289695    schedule 11.03.2014


Ответы (1)


Все мои ContentObserver были зарегистрированы и незарегистрированы внутри класса AppWidgetProvider. Читал что это не безопасно и например в некоторых телефонах LG вроде не работает. То, что я сделал, это липкое Service (в конце переопределенного метода onStartCommand() вы должны вернуть константу START_STICKY). Потом внутри сервиса прописываю ContentObserverс и теперь он работает во всех телефонах. Кажется, что липкий сервис существует вечно. В противном случае мое приложение перестанет работать, пока я не создам службу снова.

Когда сервис создается, я регистрирую ContentObserver, а когда он уничтожается, я их отменяю. Кажется, опасно забыть отменить регистрацию ContentObserver, когда вы больше не будете его использовать.

person user3289695    schedule 11.03.2014