在我的应用程序中,我正在运行前台服务。当用户注销时,我能够毫无问题地停止前台服务。但是,如果用户滑动以关闭应用程序或应用程序崩溃,则我将无法处理停止前台的操作。
OnSleep()在应用程序关闭/崩溃时被调用,但是在应用程序后台运行时也被调用。如果应用程序已后台运行,则我正在使用的前台服务必须继续运行,但是我需要在前台服务关闭而不是后台运行时停止前台服务,因此,我无法在OnSleep()方法中停止前台服务。
有什么办法可以知道应用程序何时关闭(不后台),以便我可以停止前台服务?
答案 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
答案 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();
}