启动然后销毁前台服务不会停止 VS 调试器

Starting and then destroying a Foreground service won't stop VS debugger

我有一个运行良好的前台服务,当我关闭应用程序时,我使用 OnDestroy 方法停止我的服务。一切似乎都正常,但我在 VS2019 中的调试器从未停止。我检查了模拟器中的开发人员部分是否有 运行 服务,并且有一个 none(与此项目相关),应用程序已关闭。

这让我相信后面可能还有一些东西 运行 - 或者 VS 在这种情况下以某种方式被窃听。我是否以错误的方式启动和停止?

这是我的服务

[Service]
public class ForegroundService : Service
{
    public override IBinder OnBind(Intent intent)
    {
        return null;
    }

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

        base.OnDestroy();
    }

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        PendingIntent pendingIntent = PendingIntent.GetActivity(
            Android.App.Application.Context,
            NotificationSettings.NotificationPendingIntentId,
            new Intent(Android.App.Application.Context, typeof(MainActivity)),
            PendingIntentFlags.UpdateCurrent);

        var notification = new NotificationCompat.Builder(Android.App.Application.Context, NotificationSettings.ChannelId)
            .SetContentIntent(pendingIntent)
            .SetContentTitle(NotificationSettings.Notification_app_name)
            .SetContentText(NotificationSettings.Notification_text)
            .SetLargeIcon(BitmapFactory.DecodeResource(Android.App.Application.Context.Resources, Resource.Drawable.xamagonBlue))
            .SetSmallIcon(Resource.Drawable.xamagonBlue)
            .SetDefaults((int)NotificationDefaults.Sound | (int)NotificationDefaults.Vibrate)
            .Build();

        StartForeground(NotificationSettings.SERVICE_RUNNING_NOTIFICATION_ID, notification);

        return StartCommandResult.Sticky;
    }
}

这是在 MainActivity 中:

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    CrossCurrentActivity.Current.Init(this, savedInstanceState);
    LoadApplication(new App());

    CreateNotificationChannel();

    startServiceIntent = new Intent(this, typeof(ForegroundService));
    if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
    {
        StartForegroundService(intent);
    }
    else
    {
        StartService(intent);
    }
}

protected override void OnDestroy()
{
    StopService(startServiceIntent);

    base.OnDestroy();
}

更新 1

我想我说对了。如果我 StopService(startServiceIntent); 单击按钮然后关闭模拟器中的应用程序,调试器将正确停止。我在想的是 OnDestroy 来不及调用 StopService,这导致了另一个问题,我应该什么时候停止我的服务?

我遇到了同样的问题,不得不在我的服务中使用它 class

public override void OnTaskRemoved(Intent rootIntent)
{   
     if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
         StopForeground(true);
     else
         StopService(new Intent(this, typeof(YourServiceClass))); 
    base.OnTaskRemoved(rootIntent);
    //will kill threads when app is manually killed by user.
    Java.Lang.JavaSystem.Exit(0);
}