我目前正在完成活动本身的所有工作,但这似乎不是首选的方式,因为几分钟的不活动后代码不会在电话上执行。活动声明如下:
public PlaybackModel()
{
...
queue.CurrentItemChanged += async (o, ea) =>
{
var res = ScrobbleHelper.TrySend(ea.OldItem);
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
var bg = App.Ref.IsBackground;
currentItem = o.CurrentItem;
});
};
...
}
此事件似乎有5个可能的结果:
- 当应用在前景时,杂货均正常工作;
- 当应用在屏幕上打开屏幕时,该应用程序在后台工作时可以正常工作(用户正在做其他事情(;
- 最近关闭屏幕时(当请求关闭屏幕后不久发送请求时(,crobble正在正常工作(
- 无法发送杂货,因此当屏幕关闭一分钟多一分钟时,它会被缓存(似乎互联网连接已被切断,因此杂货在本地被缓存(;
- 如果长时间关闭屏幕,则根本没有执行代码。
考虑到这一点,我正在考虑使用ApplicationTrigger
使用过程中的背景任务来调用Scrobbler,但我不确定该如何处理。
一方面,这是唯一可以执行代码而没有应用程序在前景中运行的代码的东西,但是二手,如果事件处理程序未调用代码本身,我不确定如果任务会触发。
是否还有其他UWP的API或功能可以有用?如果不是,我该如何实现背景任务以实现最大效率?
谢谢!
在Windows设备上,在前景应用程序中运行背景事件有一些限制,即,当屏幕在一定时间内关闭时,它们会被冷冻。它是为了减少电池的消耗,整个过程被悬挂在内存中,并且没有发射事件。
DO是一种在专用过程上运行背景任务的方法,即使设备在一段时间内未使用,该任务也可以正常运行。您需要创建一个专门的类实现IBackgroundTask
,然后将其固定以适当的触发器并进行注册。(如果该应用必须将内容写入应用程序状态,则您还需要一些IPC接口要考虑,因为背景任务作为另一个过程运行。(
听起来像您的应用程序正在播放媒体,并且您希望在应用程序进入后台或屏幕锁定时防止其悬挂。最好的方法是使用去年随着周年纪念更新(1607(发布的新的过程中的背景媒体播放功能。这是文档:
https://learn.microsoft.com/en-us/windows/uwp/audio-video-camera/background-audio
一个需要注意的是,在不使用时,操作系统可能会使网络适配器入睡。从症状中,您描述的可能是您在这里遇到的事情。尝试将此代码添加到您的应用程序中,以确保即使屏幕锁定屏幕,网络连接仍保持活动状态:
Windows.Media.Playback.MediaPlayer mp;
public void CreatePlayer()
{
Windows.Media.Core.MediaBinder mb = new Windows.Media.Core.MediaBinder();
mb.Binding += Mb_Binding;
var ms = Windows.Media.Core.MediaSource.CreateFromMediaBinder(mb);
mp = new Windows.Media.Playback.MediaPlayer();
mp.CommandManager.IsEnabled = false;
mp.Source = ms;
}
private void Mb_Binding(Windows.Media.Core.MediaBinder sender, Windows.Media.Core.MediaBindingEventArgs args)
{
var d = args.GetDeferral();
}
谢谢Stefan Wick -Windows开发人员平台