如何仅在应用程序关闭时结束前台服务

时间:2020-04-16 15:57:52

标签: c# android xamarin

在我的应用程序中,我正在运行前台服务。当用户注销时,我能够毫无问题地停止前台服务。但是,如果用户滑动以关闭应用程序或应用程序崩溃,则我将无法处理停止前台的操作。

OnSleep()在应用程序关闭/崩溃时被调用,但是在应用程序后台运行时也被调用。如果应用程序已后台运行,则我正在使用的前台服务必须继续运行,但是我需要在前台服务关闭而不是后台运行时停止前台服务,因此,我无法在OnSleep()方法中停止前台服务。

有什么办法可以知道应用程序何时关闭(不后台),以便我可以停止前台服务?

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,实现它的一种方法是使用BroadcastReceiver向前台服务的通知中添加一种“按钮”(动作)。因此,关闭应用程序后,用户只需轻按包含在前台通知中的按钮即可关闭前台服务。 从我的预期角度来看,您还应该重写OnDestroy()方法在此处执行一些操作,然后调用StopForeground(示例)。因为在某些情况下,系统决定自行销毁服务(例如,不再使用服务并将其删除。)。

答案 1 :(得分:0)

要停止前台服务,您可以执行以下操作:

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

您可以覆盖OnDestroy以停止前台服务。

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

StopSelf();

有关前景服务的更多详细信息,您可以看看Foreground Services

Start Services

答案 2 :(得分:0)

我找到了一个解决方案,至少看来适合我的情况。这也是一个简单的解决方法。在覆盖OnStartCommand的同一类中,我还完成了OnTaskRemoved的覆盖,当用户从服务中删除了任务时,就会触发该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();
        }