Как остановить службу переднего плана при удалении задачи?

#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, так как это их устройство. Аналогичным образом, другие производители могут делать все, что им заблагорассудится. Мы видели, как производители прекращают процесс вашего приложения, даже если у вас запущена служба переднего плана. Мы видели, как производители делают эквивалент «Принудительной остановки» в настройках, поэтому все сигналы тревоги и задания вашего приложения стираются (среди других эффектов). И так далее.

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