启动然后销毁前台服务不会停止 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);
}
我有一个运行良好的前台服务,当我关闭应用程序时,我使用 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);
}