如果应用程序正在启动,如何停止后台任务?

Posted

技术标签:

【中文标题】如果应用程序正在启动,如何停止后台任务?【英文标题】:How to stop the background task if the app is starting? 【发布时间】:2017-05-26 13:20:37 【问题描述】:

在我的应用中,应用和后台任务都访问一个文件,无论哪个先打开文件,另一个都会失败。

为避免这种情况发生,我想在用户打开应用时停止后台任务,如果应用已经打开,则不要运行后台。

如何从后台任务中知道应用程序是否正在运行?以及如何在应用程序启动之前停止它?谢谢。


这是我注册后台任务的方式:

var result = await BackgroundExecutionManager.RequestAccessAsync();

var builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(trigger);
builder.AddCondition(condition);

BackgroundTaskRegistration task = builder.Register();

有一个UserNotPresent condition 指定任务仅在用户不存在时才能运行。但我不明白现在这意味着用户正在使用应用程序或手机。

【问题讨论】:

This 可能会有所帮助。 【参考方案1】:

UserNotPresent 条件表示用户当前没有使用整个设备。

您的任务是进程内后台任务还是进程外后台任务? 我建议使用进程内任务来避免困难的跨进程通信场景并简化项目结构。

回到您确定应用是否从后台任务启动的实际问题:

对于进行中的任务,您可以检查应用的可见性状态,看看它是否在前台。这可以通过几种不同的方式完成:

在 LeavingBackground 中将 IsInForeground 标志设置为 true,然后在 EnteredBackground 中将其设置为 false。然后,您可以检查标志以查看应用是否在前台运行。 使用窗口的可见性。使用 CoreWindow.GetForCurrentThread().Visible 或 Window.Current.Visible 将使您能够查看应用程序是否在前台、最小化或在后台无头运行。两者在前台时为真,在最小化时为假。 CoreWindow.GetForCurrentThread() 将返回 null 并在应用程序无头时尝试访问 Window.Current 将引发异常。

对于进程外任务,您可以与前台应用程序通信以确定它是否存在。这可以使用此处建议的方法之一来完成:Check if application is running from a background task

如何停止后台任务

确保释放后台任务实例的延迟,然后仅从您的主要方法返回(Run() 用于进程外,BackgroundActivated() 用于进程内)。如果进程中没有其他东西在运行,那么它将退出。

【讨论】:

以上是关于如果应用程序正在启动,如何停止后台任务?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 启动和停止定期后台任务

iOS如何在本地通知上启动后台任务

调用 TaskInstance.Canceled 时如何停止后台任务?

Android 后台任务执行

linux 如何后台运行

仅启动一次后台服务,并在任务完成后停止