Windows runtime Windows phone 8.1后台任务和前台应用程序通信
我正在开发一个Windows Phone 8.1应用程序,它为每小时操作注册一个后台任务计时器触发器。因此,基本上,后台任务每60分钟唤醒一次并执行一些操作 我的问题是,当后台任务正在进行时,如果用户唤醒应用程序,是否有一种方法可以向用户显示后台任务过程中发生了什么 我知道这是两个不同的过程。我使用Silverlight 8.1项目作为前台应用程序,使用托管windows运行时项目作为后台任务。我正在使用silverlight应用程序注册后台任务,但我现在不知道如何在这两个进程之间创建通信桥梁 有什么线索吗?这可能吗 以下是关于应用程序与其后台任务之间通信的一些想法(或信息)Windows runtime Windows phone 8.1后台任务和前台应用程序通信,windows-runtime,windows-phone,windows-8.1,windows-phone-8.1,Windows Runtime,Windows Phone,Windows 8.1,Windows Phone 8.1,我正在开发一个Windows Phone 8.1应用程序,它为每小时操作注册一个后台任务计时器触发器。因此,基本上,后台任务每60分钟唤醒一次并执行一些操作 我的问题是,当后台任务正在进行时,如果用户唤醒应用程序,是否有一种方法可以向用户显示后台任务过程中发生了什么 我知道这是两个不同的过程。我使用Silverlight 8.1项目作为前台应用程序,使用托管windows运行时项目作为后台任务。我正在使用silverlight应用程序注册后台任务,但我现在不知道如何在这两个进程之间创建通信桥梁
- 您可以使用对象的进度和已完成事件。您可以使用BackgroundTaskRegistration.AllTasks获取该对象-此属性返回应用程序注册的后台任务列表。每次应用程序运行时,您都必须订阅这些活动 在后台任务中,您可以将IBackgroundTaskInstance对象的Progress属性设置为某个UInt32值,应用程序将接收事件。也许你可以把你需要的编码在那个数字里。例如:1表示任务正在初始化,2-任务正在进行工作,依此类推
- 这两个进程都可以访问相同的文件,因此您可以将其用于某些用途
- 用于在两个进程之间同步代码的执行
另外,我还没有真正尝试过这些活动,但它们似乎很有用。我已经在通信b/w后台任务和应用程序it本身上做了一些POC。我使用的是windows通用应用程序,但它也可以在silverlight手机应用程序中使用
private IBackgroundTaskRegistration timeZoonChangeTask;
public MainPage()
{
this.InitializeComponent();
NavigationHelper nvHelper = new NavigationHelper(this);
IReadOnlyDictionary<Guid, IBackgroundTaskRegistration> allTasks = BackgroundTaskRegistration.AllTasks;
if (allTasks.Count() == 0)
{
lblMessage.Text = "No Task is registered at the moment";
}
else//Task already registered
{
lblMessage.Text = "Timezoon Task is registered";
this.GetTask();
}
}
/// <summary>
/// Time zoon task registration.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void Button_Click(object sender, RoutedEventArgs e)
{
await BackgroundExecutionManager.RequestAccessAsync();
BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = "MyBackgroundTask";
SystemTrigger systemTrigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
taskBuilder.SetTrigger(systemTrigger);
taskBuilder.TaskEntryPoint = typeof(MyBackgroundTask.TheTask).FullName;
taskBuilder.Register();
lblMessage.Text = "Timezoon Task is registered";
this.GetTask();
}
/// Get registered task and handel completed and progress changed events.
/// </summary>
private void GetTask()
{
var timeZoonChangeTask = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault();
timeZoonChangeTask.Completed += timeZoonChangeTask_Completed;
timeZoonChangeTask.Progress += timeZoonChangeTask_Progress;
}
/// <summary>
/// raised when task progress is changed app is active
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void timeZoonChangeTask_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
lblTaskProgress.Text = args.Progress.ToString() + "%";
recProgress.Width = 400 * (double.Parse(args.Progress.ToString()) / 100);
});
//this.Dispatcher.BeginInvoke(() =>
// {
// });
}
/// <summary>
/// Raised when task is completed and app is forground
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void timeZoonChangeTask_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
lblMessage.Text = "Task Excecution is completed";
});
}
私有IBackgroundTaskRegistration timeZoonChangeTask;
公共主页()
{
this.InitializeComponent();
NavigationHelper nvHelper=新的NavigationHelper(此);
IReadOnlyDictionary allTasks=BackgroundTaskRegistration.allTasks;
if(allTasks.Count()==0)
{
lblMessage.Text=“目前未注册任何任务”;
}
else//任务已注册
{
lblMessage.Text=“Timezoon任务已注册”;
这个。GetTask();
}
}
///
///时间缩放任务注册。
///
///
///
专用异步无效按钮\u单击(对象发送方,路由目标)
{
等待BackgroundExecutionManager.RequestAccessAsync();
BackgroundTaskBuilder taskBuilder=新建BackgroundTaskBuilder();
taskBuilder.Name=“MyBackgroundTask”;
SystemTrigger SystemTrigger=新系统触发器(SystemTriggerType.TimeZoneChange,false);
taskBuilder.SetTrigger(系统触发器);
taskBuilder.TaskEntryPoint=typeof(MyBackgroundTask.TheTask).FullName;
taskBuilder.Register();
lblMessage.Text=“Timezoon任务已注册”;
这个。GetTask();
}
///完成注册任务和handel,并更改事件进度。
///
私有void GetTask()
{
var timeZoonChangeTask=BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault();
timeZoonChangeTask.Completed+=timeZoonChangeTask_Completed;
timeZoonChangeTask.Progress+=timeZoonChangeTask\u进度;
}
///
///任务进度更改时引发,应用程序处于活动状态
///
///
///
void timeZoonChangeTask_进度(BackgroundTaskRegistration发件人,BackgroundTaskProgressEventArgs args args)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,()=>
{
lblTaskProgress.Text=args.Progress.ToString()+“%”;
recProgress.Width=400*(double.Parse(args.Progress.ToString())/100);
});
//this.Dispatcher.BeginInvoke(()=>
// {
// });
}
///
///任务完成且放弃应用程序时引发
///
///
///
void timeZoonChangeTask_已完成(BackgroundTaskRegistration发件人,BackgroundTaskCompletedEventArgs args args)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,()=>
{
lblMessage.Text=“任务执行完成”;
});
}
下面是任务类
public sealed class TheTask:IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
///Get Deferral if we are doing aysnc work. otherwise it will not work.
//Always get deferral it will not harm.
var deferral = taskInstance.GetDeferral();
taskInstance.Canceled += taskInstance_Canceled;
for (uint i = 0; i < 10; i++)
{
taskInstance.Progress = i + 10;
await Task.Delay(2000);
}
//Write last run time somewhere so the gorground app know that at when last time this backgournd app ran.
///Set this progress to show the progesss on the forground app if it is running and you want to show it.
taskInstance.Progress = 0;
deferral.Complete();
}
void taskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
}
}
公共密封类任务:IBackgroundTask
{
公共异步无效运行(IBackgroundTaskInstance taskInstance)
{
///如果我们正在进行aysnc工作,请获得延期。否则它将不起作用。
//总是得到延期,这不会有什么坏处。
var deleral=taskInstance.getDeleral();
taskInstance.cancelled+=taskInstance\u cancelled;
对于(uint i=0;i<10;i++)
{
taskInstance.Progress=i+10;
等待任务。延迟(2000);
}
//将上次运行时间写入某个位置,以便gorground应用程序知道上次运行此Backgound应用程序的时间。
///如果forground应用程序正在运行且您希望显示,请设置此进度以显示forground应用程序上的进度。
taskInstance.Progress=0;
延迟。完成();
}
void taskInstance_已取消(IBackgroundTaskInstance发件人,BackgroundTaskCancellationReason)
{
}
}
谢谢亚森。这是一种很好的思考方式。我去看看。我也在考虑使用Windows.Storage local设置来存储一个布尔值,并在计划同步进行时将其设置为true,在完成时将其设置为false。因此,当前台应用程序打开时,用户收到一个通知,说后台正在发生一些事情。@golldy,如果你愿意的话