Как работает IntentService после того, как процесс приложения был убит

1

Просто пытаюсь прояснить мое понимание того, как IntentService управляет IntentService после достижения завершающих состояний. Под прекращением я подразумеваю, когда текущая активность уничтожена или процесс приложения завершен, согласно следующей документации: https://developer.android.com/guide/components/activities/activity-lifecycle.

Учитывая комментарий

Кроме того, IntentService не подвержен влиянию большинства событий жизненного цикла пользовательского интерфейса, поэтому он продолжает работать при обстоятельствах, приводящих к отключению AsyncTask.

по адресу https://developer.android.com/training/run-background-service/create-service;

Я чувствую, как будто:
1) На запущенный IntentService не влияет жизненный цикл активности. Это правильно?

2) Если (1) верно, будет ли он продолжать работать бесконечно даже после достижения состояния завершения, вплоть до некоторой точки, когда он либо сам остановится, либо ОС решит остановить его?

В моей конкретной ситуации я использую IntentService во время запуска приложения, чтобы запрашивать API, захватывать содержимое, а затем добавлять новую (целевую) Page в стек навигации Xamarin.Forms (это будет эквивалентно запуску нового действия). Это приводит меня к моему следующему вопросу...

3) Что произойдет, если приложение уже находится в завершенном состоянии, когда придет время, когда IntentService создаст новое действие? Конечно, активность нельзя добавить в стек навигации, так как он больше не существует после завершения работы приложения?

Теги:
xamarin
intentservice

1 ответ

1
  1. Да, запущенный IntentService не зависит от жизненного цикла действия. На самом деле, все Сервисы за пределами связанных Сервисов не затрагиваются жизненным циклом деятельности.

  2. Служба IntentService будет продолжаться до тех пор, пока не завершит свою работу, приложение не будет уничтожено или система не решит уничтожить Service из-за изменений в правилах фоновой службы Android 8.0.

  3. Ваше использование завершенного состояния слишком широкое... Если приложение уже завершено, то ничего не произойдет, потому что IntentService был бы уже завершен. Если ней Activity, которая запустила IntentService, которая была прекращена, то ничего не происходит, так как по умолчанию, IntentService не имеет ничего общего с деятельностью, даже если это тот, который начал.

Последний вопрос зависит от того, как вы решите сообщить результат IntentService в Activity.

  • Если вы используете BroadcastReceiver, то ничего не произойдет, потому что IntentService запустит трансляцию без каких-либо проблем, но Activity не сможет получить результаты, так как она была прервана.

  • Но если вы просто создать новую Activity, то вы можете просто использовать startActivity() с данными результатов, добавленных к Намерению. Хотя, я сомневаюсь, что пользователь будет рад видеть Activity внезапно открыть на экране, когда они больше не в вашем приложении. Начиная новую Activity не имеешь ничего общего с предыдущей Activity, так как любой экземпляр Context может начать Activity.

Честно говоря, исходя из вашего вопроса, звучит так, как будто вы очень заинтересованы в IntentService и его связи с Activity которая его запустила. Если это так, то вам действительно не следует использовать IntentService, поскольку это не совсем его цель. Это не значит иметь связь с Activity. Это просто означало сделать работу и закончить.

Вместо этого лучше использовать связанный Service, поскольку он имеет прямое соединение с Activity которая его запустила.

  • 0
    Спасибо, Джеки. Это дает мне немного лучшее понимание. Я на самом деле не заботится о Activity , которая началась моя IntentService , скорее Activity , что мой IntentService начнется , как только это будет сделано все его обработку. Как вы говорите, IntentService может фактически вызвать внезапное появление Activity ; но фактический код , что IntentService вызывает , чтобы начать эту новую Activity существовал в предыдущей Activity , которая в настоящее время прекращена, так как это вообще возможно?
  • 0
    Я не понимаю , что вы подразумеваете под «фактическим кодом , что IntentService вызывает , чтобы начать эту новую Activity существовала в предыдущей Activity , которая в настоящее время прекращено». Вы говорите о startActivity() ? startActivity() не является методом, который принадлежит Activity , а принадлежит родительскому классу Context . Service также является дочерней по отношению к Context , так что это IntentService также является дочерней по отношению к Context . Это дает IntentService возможность напрямую использовать startActivity() .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню