2014-02-19 7 views
1

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

@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 не выдается исключение или сообщение об ошибке. Я не знаю, в чем проблема.

+0

Samsung и LG сильно изменяют код рамки, вы проверяли какие-либо сообщения об ошибках LG для этой проблемы? –

+0

Да, да. Я ничего не нашел. И ContentObserver - очень простой механизм Android. Я не понимаю, как производители могут это изменить. Это будет означать, что в телефонах LG многие приложения не будут работать, например, мои. Многим приложениям нужны ContentObservers. – user3289695

+0

Причиной моей проблемы может быть то, что я вызываю конструктор ContentObserver, передавая ему null вместо экземпляра Handler? Это единственная странная вещь, которую я вижу в своем коде. – user3289695

ответ

0

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

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