Лучшая стратегия для реализации этого поведения в приложении для Android?

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

Я уже реализовал службу, которая вызывается из будильника для ежедневного обновления. У меня проблема с разработкой стратегии почасовой синхронизации. Я мог бы также использовать ежечасный будильник и активировать то же самое намерение, но, поскольку ваше приложение может быть уничтожено в любое время, отменить его было бы невозможно (а поскольку они используют одно и то же намерение, выполнение отмены отменит ВСЕ будильники, включая мой ежедневная синхронизация, так что это, вероятно, нехорошо).

Другой вариант — использовать таймер, который устанавливается внутри приложения, и запускать мое намерение внутри приложения. Я предполагаю, что все таймеры отменяются, когда приложение уничтожается, верно? Но мое приложение состоит из нескольких действий, и я хочу, чтобы таймер работал во всех действиях, как мне это сделать? Я не хочу дублировать код — мы уже используем подкласс для Activity и ListActivity.


person Eno    schedule 02.07.2010    source источник


Ответы (2)


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

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

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

FWIW, ваше приложение не будет уничтожено, пока оно находится на экране. И хотя он не отображается на экране, вы не хотите, чтобы обновления шли ежечасно.

Я предполагаю, что все таймеры отменяются, когда приложение уничтожается, верно?

Приложения вообще не "убиваются". Мы ожидаем, что вы будете убирать за собой, когда ваши действия вызываются с помощью onDestroy(). Если вы настроили Timer с потоком демона, вам нужно будет завершить этот поток.

Но мое приложение состоит из нескольких действий, и я хочу, чтобы таймер работал во всех действиях, как мне это сделать?

Привязка к вашему сервису от каждого вашего действия. Если он запущен вашим будильником Intent, пусть он выполняет обычную обработку обновлений. Если он запущен из-за запроса на привязку, просто убедитесь, что его почасовой Timer работает. Когда он вызывается с onDestroy() (например, после того, как все действия были развязаны), пусть он останавливает Timer.

person CommonsWare    schedule 02.07.2010
comment
На самом деле это это приложение, которое люди могут использовать часами (я не могу сказать, что это такое, не нарушая NDA). Тем не менее, я решил отказаться от идеи ежечасного обновления через таймеры/будильники. Схему, которую я решил реализовать: * Обновление один раз в день с помощью одного будильника (который затем получает свежие данные и устанавливает новый будильник на следующий день). * Если пользователь использует приложение и с момента последнего обновления прошло > 1 час, выполните фоновое обновление. * Для одного конкретного действия, если пользователь изменил некоторые данные, я выталкиваю эти данные. * Пользователь также может принудительно обновить вручную в любое время. - person Eno; 07.07.2010
comment
@Eno: звучит как отличный план. - person CommonsWare; 07.07.2010
comment
Хотелось бы более подробного примера использования wakelock в Android. Я просмотрел книгу Busy Coder, но мне трудно ее понять. - person Eno; 08.07.2010

Возможно, вы сможете запустить таймер в фоновой службе (которая будет уничтожена реже, чем действия), но все еще нет гарантии, что Android не уничтожит вашу службу. И запуск чего-то подобного в фоновом режиме может потреблять много батареи.

Как насчет выполнения почасовой синхронизации в фоновом потоке, созданном в onResume? И просто сохраните последний раз, когда пользователь выполнял синхронизацию, и если прошло более часа, просто выполните синхронизацию. Потому что я не думаю, что есть какая-то причина охотно синхронизировать данные, которые пользователь никогда не увидит.

person Robby Pond    schedule 02.07.2010