#android #android-studio #kotlin
Вопрос:
Я пытаюсь остановить службу при выходе из приложения, однако она продолжает работать в течение минуты или двух.
Это код, на который я полагаюсь:
override fun onTaskRemoved(rootIntent: Intent?) {
stopSelf()
super.onTaskRemoved(rootIntent)
}
если бы я остановил его вручную нажатием кнопки, а затем вышел из приложения, все работает. Я вижу, что процесс немедленно завершается в Android studio.
Прослушиватель кнопок в основной активности:
binding.mainBtn.setOnClickListener {
isConnected = if(!isConnected amp;amp; checkPermission()) {
startService(Intent(this, MyForegroundService::class.java))
binding.mainBtn.setImageResource(R.drawable.ic_baseline_stop_24)
true
} else {
stopService(Intent(this, MyForegroundService::class.java))
binding.mainBtn.setImageResource(R.drawable.ic_baseline_play_arrow_24)
false
}
}
Файл манифеста выглядит следующим образом:
<service
android:name=".services.MyForegroundService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="microphone"/>
Комментарии:
1. Возможно, вы захотите позвонить
stopForeground()
раньшеstopSelf()
. Кроме того, поведение, когда пользователь удаляет задачу с обзорного экрана, зависит от оборудования. Например, я как раз занимался этой проблемой с устройствами OnePlus, где они ведут себя несколько иначе, не прекращая процесс, даже если вы используетеstopForeground()
иstopSelf()
. «однако он продолжает работать в течение минуты или двух» — что конкретно это означает?2. Ну, функция «остановить приложение» в Android studio не выделена серым цветом, я могу продолжать профилировать приложение примерно в течение одной или двух минут, прежде чем оно завершится. Так случилось, что я пользуюсь устройством OnePlus. Что я нахожу странным, так это то, что он немедленно завершается, если я остановлю службу нажатием кнопки, а затем удалю задачу с экрана. В обоих случаях запускается stopService, и я ожидаю одного и того же поведения.
Ответ №1:
Ну, функция «остановить приложение» в Android studio не выделена серым цветом, я могу продолжать профилировать приложение примерно в течение одной или двух минут, прежде чем оно завершится
Ваш процесс все еще работает. Нет никаких требований, чтобы удаление задачи с обзорного экрана завершало ваш процесс или чтобы это происходило во всех случаях.
В обоих случаях запускается служба stopService, и я ожидаю одного и того же поведения
Увы, это нереалистичное ожидание.
Многие устройства завершат процесс вашего приложения, когда пользователь уберет задачу с экрана обзора, если либо:
- В данный момент у вас не запущена служба переднего плана, или
- Вы делаете, но вы останавливаете эту службу переднего плана в
onTaskRemoved()
Однако это не гарантируется. Другие шаблоны включают то, что делает OnePlus, где ваш процесс остается запущенным, даже если вы остановите службу переднего onTaskRemoved()
плана . Это решение должен принять OnePlus, так как это их устройство. Аналогичным образом, другие производители могут делать все, что им заблагорассудится. Мы видели, как производители прекращают процесс вашего приложения, даже если у вас запущена служба переднего плана. Мы видели, как производители делают эквивалент «Принудительной остановки» в настройках, поэтому все сигналы тревоги и задания вашего приложения стираются (среди других эффектов). И так далее.
В целом, постарайтесь сделать несколько предположений о поведении приложения, когда пользователь удаляет задачу с обзорного экрана.