Виджет перестает обновляться после закрытия приложения - PullRequest
0 голосов
/ 10 июня 2018

В классе AppWidgetProvider у меня работает простой CountDownTimer.

object : CountDownTimer(30000, 1000) {

    override fun onTick(millisUntilFinished: Long) {
        val appWidgetManager = AppWidgetManager.getInstance(context)
        val views = RemoteViews(context.packageName,R.layout.view_group)
        views.setTextViewText(R.id.m_text_view,"seconds remaining: " + millisUntilFinished / 1000)
        appWidgetManager.updateAppWidget(appWidgetIds[0], views)
    }

    override fun onFinish() {
        // Do nothing
    }
}.start()

Это обновляет соответствующий виджет (appWidgetIds[0]), как и ожидалось, но это только в случае, когда приложениеоткрыт.Когда я смахиваю приложение в меню последних, закрывая его, виджет перестает обновляться.

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Найден ответ.

В методе onStartCommand службы верните флаг START_STICKY.Это сообщит ОС, если по какой-либо причине служба закрывается, запустите ее снова, когда у вас будет достаточно ресурсов.

source
больше информации

При перезапуске вы можете получить все идентификаторы виджетов следующим образом:

ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

источник

РЕДАКТИРОВАТЬ

Точно так же, как вы знаете, в версиях Android больше, чем API 23, даже флаг START_STICKY не достаточен для того, чтобы ОС перезапустила службу.

Я решил пропустить эту функцию, потому что она не будет работать в будущих версиях Android.

0 голосов
/ 10 июня 2018

Когда я смахиваю приложение в меню последних, т. Е. Закрывая его, виджет перестает обновляться.

Это обычно останавливает ваш процесс, и в этот момент ваш CountDownTimer больше не будетсуществует.

Я тоже пытался использовать отдельную службу, но результат тот же

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

Выполнение работы каждые 30 секунд в фоновом режиме довольно плохо с точки зрения потребления батареи, поэтому это нецелесообразно в современных версиях Android.

...