Ответ Фалмарри правильный, и я не понимаю твоих опасений.
В onPostExecute()
, когда вы определяете, что все пошло не так:
- Позвоните
getSystemService(ALARM_SERVICE)
, чтобы получить AlarmManager
- Позвоните
set()
на AlarmManager
, чтобы вызвать вас через 5 минут
При необходимости используйте дополнительные символы в Intent
в PendingIntent
, чтобы дать вам информацию о том, что нужно повторить, или используйте строку настраиваемого действия, чтобы отличить повторные попытки от запланированного сигнала тревоги, или что-то еще. Обратите внимание, что если вы используете Intent
дополнительные функции, вам нужно будет выбрать соответствующий флаг с помощью PendingIntent
(например, FLAG_UPDATE_CURRENT
).
Проблема в том, что AlarmManager запускается из одного класса, но AsyncTask находится в другом классе, поэтому
класс, который запускает AlarmManager, не знает, провалился он или нет.
Так? Несколько классов могут общаться с AlarmManager
. Кроме того, не стесняйтесь передавать данные вашему подклассу AsyncTask
через его конструктор.
Кроме того, вы можете рассмотреть возможность использования IntentService
вместо Service
и AsyncTask
. IntentService
автоматически создает фоновый поток. Кроме того, он отключается, когда больше не нужно выполнять работу, что также важно, так что вы не получаете кучу однозвездочных рейтингов на Рынке, жалующихся на службу, которую вы постоянно используете.
Я не хочу запускать AlarmManager из onPostExecute () моего класса Service.
Почему бы и нет?
Если я запускаю AlarmManager из Сервиса, я как бы создаю повторяющуюся функцию, где
Я звоню в Службу от себя.
Конечно. Это то, что ты хочешь. Неважно, является ли Service
, AsyncTask
или MyOtherReallyCoolClass
тем, кто на самом деле разговаривает с AlarmManager
- компонент, который перепланирует Service
, является самим Service
.