Фоновые службы Android, сигналы тревоги и сохранение ссылки на объект после перезапуска приложения

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

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

  • Услуги
  • Будильники

Первый не очень подходит для моих требований, потому что он может быть убит ОС в случае нехватки памяти, поэтому для меня он бесполезен. startForeground () не так хорош, потому что я хочу, чтобы процесс молчал.

Аварийный сигнал в порядке, потому что он не может быть отключен ОС, поэтому он может работать бесконечно. Но ... Если я планирую намерение с помощью AlarmManager, как я могу сохранить ссылку на намерение, сохранившуюся при перезапуске приложения?

Например, если я хочу отменить или перенести тревогу, мне нужна ссылка на начальное намерение, чтобы отменить его с помощью метода «AlarmManager.cancel (Intent i)». Но если приложение было перезапущено пользователем, как я могу получить ссылку на первоначальное намерение, которое использовалось для запуска тревоги?

Есть ли другой способ отключить будильник, если запущенное приложение было перезапущено?


person user3396673    schedule 08.03.2014    source источник
comment
Аварийные сигналы также могут быть отключены в ситуациях с нехваткой памяти. Фактически, все ваше приложение может быть. Вы ничего не можете сделать, чтобы предотвратить отключение из-за нехватки памяти.   -  person Gabe Sechan    schedule 08.03.2014


Ответы (4)


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

В любом случае вы пропустили другое возможное решение: SyncAdapter < / strong>. Его цель - синхронизация с серверами, но вы можете делать в коде все, что хотите, и маловероятно, что ОС его убьет, в отличие от других решений, которые вы упомянули.

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

person android developer    schedule 08.03.2014

да, обратите внимание, что cancel ищет PendingIntent, а не Intent как таковое.

so

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, R.string.some_string, new Intent(this, InitialIntent.class), 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);

доставит вас туда, где вы хотите быть.

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

person anthropic android    schedule 08.03.2014

На этот вопрос только что был дан ответ здесь:

Как узнать контекст других действий?

Просто отмените запланированное вами намерение

person G. Blake Meike    schedule 08.03.2014

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

Вам нужно посмотреть на модель связи BroadcastReceiver и GCM. Надеюсь это поможет

person raoadnan    schedule 28.04.2014