Windows Phone代理详解

应用于Windows Phone 8 | Windows Phone OS 7.1

调度任务和后台代理使得一个应用即使不在前台运行时也能在后台执行代码。不同类型的调度任务被设计用于不同类型的后台处理场景,并因此具有不同的行为和限制。本主题描述了调度、持续时间和限制等方面的问题。

此主题包含以下部分:

·调度任务的类型

·后台代理的生命周期

·所有调度任务类型的限制

·周期性代理的限制

·资源集中型代理的限制

·相关主题

Scheduled Task的类型

SHAPE \* MERGEFORMAT

下面所列的是Scheduled Task的类型。注意ScheduledTask 是从ScheduledAction派生的。运行于后台的代码存放于从ScheduledTaskAgent派生的类中,而ScheduledTaskAgent是从类BackgroundAgent派生的。

Scheduled Task 类型

描述

PeriodicTask

周期性代理,每经过一个周期性循环间隔就运行一小段时间。使用此种任务的典型情况包括上传设备的位置和执行小量的数据同步。

ResourceIntensiveTask

资源密集型代理,指当phone遇到与处理器activity、电源、网络连接相关的集中需求时需运行相对较长一段时间的后台代理。应用这种任务的一个典型的场合是当phone没有被用户使用而未处于活动状态时,后台同步大量的数据到phone上。

后台代理的生命周期

SHAPE \* MERGEFORMAT

一个应用可能只有一个后台代理。这个代理可以被注册为一个PeriodicTask,一个ResourceIntensiveTask,或两者兼具。对代理运行所使用的调度算法依赖于任务所注册的类型。在某一时刻,只有一个代理的实例在运行。

代理的代码在一个BackgroundAgent派生类中实现。当代理被启动,操作系统会调用其OnInvoke(ScheduledTask)方法。在此方法中,应用可以确定是被作为哪种类型的ScheduledTask在运行,然后执行合适的动作。当代理完成了它的任务,它应该调用NotifyComplete Abort 以使操作系统知道它完成了。NotifyComplete 应在任务执行成功后使用。如果代理不能执行它的任务-比如所需的服务端不能连接了-那么代理应该调用Abort,这使得IsScheduled 属性被置为false。前台应用可以检查此属性以确定是否后台调用了Abort。

各调度任务的类型的共同限制

SHAPE \* MERGEFORMAT

下面的约束应用于所有的Scheduled Tasks。

限制

描述

不支持的APIs

有很多API不能被任何Scheduled Task使用。使用这些API 不是导致运行时抛出异常,就是导致在提交应用到商店时认证失败。要查看被限制的API们,见Unsupported APIs for background agents for Windows Phone

内存使用限制

周期性代理和资源密集型代理不论任何时刻都不能使用超过6 MB内存。音频代理限制到15 MB。如果一个Scheduled Task 超出了这个内存数量,它将被立即终止。

当运行于debugger模式时,内存和超时的限制被临时取消。你可以使用ApplicationMemoryUsageLimit API 来查询前台应用和后台代理的内存限制。

每两周需重新调度一次

使用ScheduledTaskExpirationTime 属性来设置多长时间之后停止任务的调度。当action 是被Add(ScheduledAction)方法所调度时,此值必须被设置为小于两周的时间。当与任务关连的应用在前台运行时,它可能重新调度任务从而重新把运行期限设置为从现在开始的两周。存在很多使一个应用的后台代理不会停止或会重生的情况,如果你的应用的Tile被固定在开始屏幕上了,你的后台代理在任何调用Update(ShellTileData) 来更新Tile时,其生存时间会被自动扩展到两周。更多信息见Tiles for Windows Phone.

如果你的应用被用户选择显示于锁屏上,你的后台代理的生存期在每次它调用Update(ShellTileData)来更新锁屏时自动扩展到两周。更多的信息,见Lock screen notifications for Windows Phone 8

如果你的应用使用一个资源密集型代理自动上传图像,如果用户在图像+相机设置页中为你的应用启动了此特性,那么这个资源密集型代理的调度将永不停止。更多的信息,见 Auto-upload apps for Windows Phone 8

连续两次崩溃后代理停止调度

周期性和资源密集型代理都会在因为超出内存配额或且它任何未处理的异常连续两次退出后停止调度。代理必须通过前台进程才能重新调度。

周期性代理的限制

SHAPE \* MERGEFORMAT

下面是代理的调度,持续时间和普遍性的限制。

限制

描述

调度间隔:30分钟

周期性代理一般每30分钟运行一次。为了延长待机时间, 周期性代理可能调整到与其它后台进程相连的时间运行,所以其执行时间可能会有10分种的波动。

调度持续:25秒

周其性代理通常运行25秒。也有其它的限制条件可能导致一个代理过早终止。

省电模式可以阻止执行

省电模式是一个选项,用户可以启用它来表明优先节省用电量,如果此模式被启用,即使超过了间隔时间 ,周期性代理可能不再运行。

各设备的周期性代理限制

为了帮助最大程度的节省电量,有一个对于周期性代理的数量上的硬规定。这跟据每个设备的配置而不同,它最低可以到6。还有一个限制低于硬规定数,在超过这个限制之后用户被警告有多个后台代理运行从而使电量被快速消耗。

注意:

如果你想在超出设备的限制数后添加一个周期性后台代理的话,对Add(ScheduledAction) 的调用将抛出一个InvalidOperationException。因为各设备的周期性代理数限制的太低,所以你的应用很容易遇到这个问题。所以,当添加周期性代理时,捕获这个异常是非常重要的,这样你的应用才不会崩溃。示例代码可以在这里Background agent best practices for Windows Phone.找到。

资源密集型代理的限制

SHAPE \* MERGEFORMAT

下面是资源密集型代理的调度,持续时间,和一般性限制。

限制

描述

持续:10分钟

资源密集型代理一般只运行10分钟。还有一些其它限制可能导致一个代理过早终止。

需要外部电源

资源密集型代理只有在设备连接到一个外部电源时才运行。

非蜂窝连接

资源密集型代理只有在建立Wi-Fi连接或通过连接到PC建立网络连接时才运行。

最小电量

资源密集型代理只有在设备的电量大于90%时才运行。

需要锁屏

资源密集型代理只有在锁屏时才会运行。

不通话

资源密集型代理不会在打电话时运行。

不能改变网络到蜂窝

如果一个资源密集型代理试图调用AssociateToNetworkInterface(Socket, NetworkInterfaceInfo) 时指定了MobileBroadbandGSM或MobileBroadbandCDMA,调用会失败。

如果一个设备进入一个状态,这个状态满足了以上所有条件然后一个资源密集型代理开始运行,之后设备的状态就发生了改变,然后其中某一项条件不再满足,那么这个资源密集型代理将立即终止。

注意:

由于设备的所有条件都满足才能运行资源密集型代理,可能会出现一个代理在某个设备上永远不能运行。例如,如果一个用户没有连接Wi-Fi或一个PC,它将永不能获得一个非蜂窝连接,并且资源密集型代理将永不运行。同时,资源密集型代理只能有一个在运行,所以当更多的应用使用资源密集型代理时,某个代理运行的希望更加渺茫。你应该在设计你的应用时仔细斟酌这个问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值