Как завершить приоритетный сервис только после закрытия приложения - PullRequest
0 голосов
/ 16 апреля 2020

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

OnSleep () вызывается, когда приложение закрывается / падает, однако оно также вызывается, когда приложение фоновое. Служба переднего плана, которую я использую, ДОЛЖНА продолжать работать, если приложение было фоновым, но мне нужно остановить службу переднего плана, когда оно было закрыто, а не фоновым, по этой причине я не могу остановить службу переднего плана в методе OnSleep ().

Могу ли я узнать, когда приложение закрывается (не в фоновом режиме), чтобы справиться с остановкой службы переднего плана?

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Я столкнулся с той же проблемой, и одним из способов ее реализации было добавление своего рода «кнопки» (действия) к уведомлению службы переднего плана, используя BroadcastReceiver . Поэтому после закрытия приложения пользователь сможет закрыть службу переднего плана, просто нажав на кнопку, включенную в уведомление переднего плана. С моей точки зрения, вы также должны переопределить метод OnDestroy (), чтобы сделать что-то там и вызвать StopForeground (пример). Потому что могут быть случаи, когда система сама решает уничтожить службу (например, служба больше не используется и удаляется).

0 голосов
/ 17 апреля 2020

Я нашел решение, которое, по крайней мере, похоже на мою ситуацию. Это также простое исправление. В том же классе, в котором я переопределяю OnStartCommand, я также сделал переопределение OnTaskRemoved, которое запускается, когда пользователь удаляет задачу из службы. Поэтому, когда пользователь проведет пальцем, чтобы закрыть приложение, будет вызван OnTaskRemoved, где вы сможете обработать закрытие службы.

public override void OnTaskRemoved(Intent rootIntent)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
            {
                StopForeground(StopForegroundFlags.Remove);
            }
            else
            {
                StopForeground(true);
            }

            StopSelf();

            base.OnDestroy();
            System.Diagnostics.Process.GetCurrentProcess().Kill();
        }
0 голосов
/ 17 апреля 2020

Чтобы остановить службу Foreground, вы можете сделать это:

var intent = new Intent(this, typeof(ForegroundService));
StopService(intent);

Вы можете переопределить OnDestroy, чтобы остановить службу Foreground.

StopService(new Intent(this, typeof(ForegroundService));

Или

StopSelf();

Более подробную информацию о сервисе Foreground вы можете посмотреть Foreground Services

и Start Services

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...