2010-11-03 2 views
3

То, что я пытаюсь сделать, - это как только AppWidget будет удален из главного экрана Android-телефона пользователя, я хочу остановить фоновый сервис, который обновляет AppWidget.AppWidget Update Service не останавливается на удалении виджета с хоста

Вот код, который я использую ... не понимаю, что не так?

@Override 
public void onDeleted(Context context, int[] appWidgetIds){ 
Intent serviceIntent = new Intent(context, UpdateService.class); 
context.stopService(serviceIntent); 
super.onDeleted(context, appWidgetIds); 
} 

Любые идеи? Спасибо за помощь.

+0

Помогает ли это переопределять onDisabled (контекстный контекст) в этом отношении? – Aakash

+0

Любое исключение бросается? –

+0

@ prateek-jain не исключены исключения, но сервис не останавливается. – Aakash

ответ

5

После многих исследований я наконец установил ее. Моя цель состояла в том, чтобы остановить фоновый сервис, если все экземпляры AppWidget удалены с экрана.

Это то, что сделал это ...

  1. Используется совместно предпочтения для переключения 1 и 0. SharePref переключается в 1, когда самый первый экземпляр виджета помещается на экране пользователя. Он переключается на 0, когда последний экземпляр виджета приложения удаляется с экрана.

  2. @Override OnReceive метод в Сервисе. Слушайте эти трансляции - AppWidget Enabled (широковещательная передача, когда на экране помещается самый первый экземпляр виджета), AppWidget отключен (транслируется ОС, когда последний экземпляр виджета удален с экрана) Когда отключено приложение AppWidget широковещательный вызов метода переопределенного метода OnDisabled.

3.In @Override Метод вызова OnDisabled stopService. Прекрасно работает.

Помните о различии между OnDeleted и OnDisabled. OnDeleted вызывается, когда экземпляр виджета удален, это не значит, что удаленный виджет является последним. Я хотел, чтобы мой сервис все еще работал, даже если на экране был один экземпляр виджета.

* Также, если вы не хотите делать все вышеперечисленное и позволить Android позаботиться о Сервисе и т. Д., Используйте IntentService. * *

+1

Также помните, что это ключ к работе над ошибкой в ​​инфраструктуре AppWidget, которая была подтверждена в группах Google о getAppWidgetIds(), которая дает случайные значения, и нет способа узнать об этом методе, если ваши виджеты подняты и должны ли вы обновите его. Поэтому каждый раз, когда настало время обновить виджет, проверьте значение Shared Pref, а затем продолжите обновление. Экономит много накладных расходов! Дайте мне знать, хочет ли кто-нибудь код. – Aakash

+0

Можете ли вы поделиться иллюстративным исходным кодом? – pfonseca

+0

, пожалуйста, поделитесь исходным кодом. – UMAR

0

Я думаю, что диспетчерское обслуживание вызывает onDestroy в самой Сервисе. Это работает для меня с помощью следующего кода в службе

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    timer.cancel(); 
    //Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); 

} 

таймер IST таймера, который я начинаю в _startService ничтожной

+0

Не решает проблему ... Пробовал. – Aakash

Смежные вопросы