0
回答
Background Task & Multitask (后台任务和多任务处理)
华为云数据库免费试用   

概述

为了确保创建一个快速响应的用户体验以及为了优化手机上的电源使用,在 Windows Phone 中,仅允许在前台运行一个应用。然而,Windows Phone 中的若干功能为应用在不是活跃的前台应用时提供执行操作的能力。

同样的,在Windows 8中,当用户将应用移下屏幕时,Windows 8 会在内存中挂起应用。这样可允许其他应用在前台运行。当应用挂起时,它驻留在内存中,并且 Windows 已停止其运行。

可以看到,Windows Phone在处理后台任务的机制上跟IOS是类似的,应用在被切到后台后,操作系统处于合理分配资源和保持运行流畅的考虑,可能会将应用挂起,这时候就需要做相应的数据保存与恢复的操作,而Android不需要考虑这个问题,Android的多任务是多个任务同时在后台执行代码、抢占资源。

Windows Phone的后台任务

后台音频

即使当您的应用不再在前台中运行时,Windows Phone 应用仍可以播放持续运行的音频。为了实现此任务,必须创建一个持续在后台中运行的 AudioPlayerAgent。而Android要实现后台音频播放,主要通过一个继承自Service的服务类,在AndroidManifest.xml配置文件中添加对该Service的注册来实现。有关如何实现Windows Phone后台音频的更多信息,请参见如何播放 Windows Phone 的后台音频

计划任务

“计划任务”允许应用实现一个代理,该代码即使当主应用未运行时,仍可以在后台中执行代码。可以通过两种方法计划其中一个代理的运行时间。定期任务运行的时间通常较短。资源密集型任务会运行较长的一段时间,但仅在手机处于资源密集型处理未干扰前台体验的状态时运行。

计划任务的类型

下面是计划任务的类型。请注意,ScheduledTask 派生自 ScheduledAction。在后台运行的代码放置在从ScheduledTaskAgent(派生自 BackgroundAgent)派生的类中。

计划任务类型

说明

PeriodicTask

定期代理以定期重复的间隔运行一小段时间。这种类型的任务的典型方案包括上传设备的位置以及执行少量的数据同步。

ResourceIntensiveTask

资源密集型代理在手机符合与处理器活动、电源以及网络连接有关的一组要求时运行,运行的时间相对较长。这种类型任务的典型方案是,在用户没有主动使用手机时将大量数据同步到手机。

Windows Phone中可以用后台代理实现后台任务,同样的Android及IOS中也有相应的实现方法。例如Android中可以用AsyncTask这样实现:

http://news.qq.com/zt2013/CHANGE_3/jlp.htm

可以用Service这样实现:

public class WxService extends Service{

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Timer timer = new Timer();
        timer.schedule(new Work(),0, 30000);
        
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
    }
}
class Work extends TimerTask{
        @Override
        public void run() {
            // TODO Auto-generated method stub
        Message message = new Message();
        message.what=1;
        handler.sendMessage(message);
        } 
     }
     
     Handler handler = new Handler()
     {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            if(msg.what==1)
            {
                new Updata().execute();
            }
        }
         
     };

IOS中这样实现:

- (void)applicationDidEnterBackground:(UIApplication *)application {
 //切入后台 ,申请后台任务时间,
    UIApplication *app = [UIApplication sharedApplication];
    UIBackgroundTaskIdentifier taskID;//一个后台任务标识符
    taskID = [app beginBackgroundTaskWithExpirationHandler:^{ //如果系统觉得我们运行时间太长,将执行这个程序块,并停止运行应用程序
       
        [app endBackgroundTask:taskID];
    }];
    
    if (taskID == UIBackgroundTaskInvalid) {//UIBackgroundTaskInvalid表示系统没有为我们提供额外的时间
       
        return;
    }

    [self performSelector:@selector(exitApp) withObject:nil afterDelay:180.0];//退入后台 延时3分钟,退出登陆
  
}
- (void)applicationWillEnterForeground:(UIApplication *)application {

    [[UIApplication sharedApplication] endBackgroundTask:taskID];//切回前台,结束后台任务
    [NSObject   cancelPreviousPerformRequestsWithTarget:self selector:@selector(exitApp) object:nil];//取消之前将要退出的方法

}

后台代理生命周期

一个应用程序可能只有一个后台代理。可以将该代理注册为 PeriodicTask、ResourceIntensiveTask 或两者。运行代理的计划取决于注册的任务类型。将在本主题的后面部分介绍计划的详细信息。一次只能运行代理的一个实例。

代理的代码由应用程序在从 BackgroundAgent 继承的类中实现。代理启动时,操作系统调用 OnInvoke(ScheduledTask)。在该方法中,应用程序可以确定它以哪种 ScheduledTask 类型运行,并执行相应的操作。代理完成其任务之后,它应该调用 NotifyComplete() 或 Abort() 以让操作系统知道它已完成。如果任务成功,则应该使用 NotifyComplete。如果代理无法执行其任务(如所需的服务器不可用),则代理应该调用 Abort,这将导致 IsScheduled 属性设置为 false。前台应用程序可以在其运行时检查该属性,以确定是否调用了 Abort。

限制

限制

说明

不支持的 API

有一组无法由任何计划任务使用的 API。使用这些 API 将导致在运行时引发异常,或者将导致在提交到 商店 期间应用程序无法认证。有关受限制的 API 的列表,请参见 Windows Phone 的后台代理不支持的 API

内存使用上限

定期代理和资源密集型代码任何时候都不能使用超过 11 MB 的内存。音频代理限制为 15 MB。如果计划任务超过此内存上限,则立即终止。

在调试器下运行时,暂停内存和超时限制。可以使用 ApplicationMemoryUsageLimit API 查询前台应用程序和后台代理的内存限制。

每隔两周需要重新计划

使用 ScheduledTask 对象的 ExpirationTime 属性设置之后不再运行任务的时间。当使用Add(ScheduledAction) 方法计划操作时,该值必须设置为两周之内的某个时间。当与该任务关联的应用程序在前台运行时,可能会重新计划该任务并将过期时间重置为从当前时间起最多两周。

极少数情况下,应用的后台代理不会过期或会自动续订。

●  如果应用的图块固定在手机的“开始”屏幕,则无论后台代理何时调用Update(ShellTileData) 来更新图块,后台代理计划的过期时间均会自动延长至两周。有关更多信息,请参见 Windows Phone 的图块

●  如果用户选择您的应用以在锁定屏幕上显示通知,则无论后台代理何时调用Update(ShellTileData) 来更新锁定屏幕,后台代理计划的过期时间均会自动延长至两周。有关更多信息,请参见 Windows Phone 8 的锁定屏幕通知

●  如果应用使用资源密集型代理自动上载照片,则只要用户在“照片和相机”设置页面启用应用的此功能,资源密集型代理计划就不会过期。有关详细信息,请参见Windows Phone 8 自动上载应用

两次连续崩溃之后取消代理计划

如果由于超过内存配额或任何其他未处理的异常而连续两次退出,则取消定期代理和资源密集型代理的计划。代理必须由前台应用程序重新计划。

定期代理的限制

限制

说明

计划间隔:30 分钟

定期代理通常每隔 30 分钟运行一次。若要优化电池使用时间,定期代理的运行可以与其他后台进程一致,因此执行时间可能最多漂移 10 分钟。

计划持续时间:25 秒

定期代理通常运行 25 秒。其他限制可能会导致代理提取终止。

节电模式可能会阻止执行

节电模式是一个选项,用户可以在设备上启用该选项以指示应该优先考虑电池使用时间。如果启用此模式,则定期代理可能不运行,即使间隔已过也是如此。

每个设备的定期代理限制

为了帮助最大程度地提高设备的电池使用时间,对手机上可以计划的定期代理数量进行了硬性限制。它因每个设备配置而异并且可以低到 6。还有另一个低于硬性限制的限制,超过该限制之后会警告用户他们正在运行多个后台代理,因此电池消耗可能比较快。

警告说明警告:
当超出设备限制时,如果您尝试添加定期后台代理,则对 Add(ScheduledAction) 的调用将引发 InvalidOperationException。由于每个设备的定期代理限制非常低,因此您的应用程序很可能会遇到此异常。出于此原因,您在添加定期代理时捕获此异常非常重要,这样您的应用程序就不会崩溃。其示例代码可以在 Windows Phone 的后台代理最佳做法中找到。


资源密集型代理的限制

限制

说明

持续时间:10 分钟

资源密集型代理通常运行 10 分钟。其他限制可能会导致代理提取终止。

需要外部电源

除非设备连接到外部电源,否则不运行资源密集型代理。

需要非手机网络连接

除非设备通过 Wi-Fi 或 PC 连接建立网络连接,否则资源密集型代理不运行。

最低电池电量

除非设备的电池电量高于 90%,否则资源密集型代理不运行。

需要设备屏幕锁定

除非设备屏幕锁定,否则资源密集型代理不运行。

非活动手机呼叫

当手机呼叫处于活动状态时,资源密集型代理不运行。

不能将网络更改为手机网络

如果资源密集型代理尝试调用指定 MobileBroadbandGSM() 或 MobileBroadbandCDMA()的 AssociateToNetworkInterface(Socket, NetworkInterfaceInfo),则该方法调用失败。

如果设备达到了一种状态,即,符合所有需要的条件并且启动了资源密集型代理,那么当设备状态发生更改以至于不符合任何条件时,则会立即终止资源密集型代理。

警告说明警告:
由于必须符合设备上的限制才能运行资源密集型代理,因此在特殊的设备上可能从不运行该代理。例如,如果用户没有对 Wi-Fi 或 PC 的访问权限,则他们可能从不会有非手机网络连接,并且其设备上的资源密集型代理将从不运行。而且,资源密集型代理一次运行一个,因此当设备上安装了多个使用资源密集型代理的应用程序时,运行代理的可能性变得更低。设计应用程序时应该考虑这个问题。


后台文件传输

后台传输服务允许应用将多个 HTTP 文件传输请求进行排队,从而当应用不再在前台中运行时,可以继续执行请求。支持文件下载和上传。

后台传输API

可以在 Microsoft.Phone.BackgroundTransfer 命名空间中找到后台传输服务 API。您将使用的主要编程元素为 BackgroundTransferRequest 和 BackgroundTransferService 类。BackgroundTransferRequest 对象表示单个传输请求,包括目标和目标文件路径、传输方法以及传输的当前状态。BackgroundTransferService 对象用于启动新传输以及查询或删除现有文件传输。

支持的传输方法

后台传输服务仅支持使用 HTTP 和 HTTPS 的传输。不支持 FTP。您可以使用 BackgroundTransferService 在后台上传和下载文件。GET HTTP 方法支持下载文件,POST 方法支持下载或上传文件。可以通过使用 BackgroundTransferRequest 对象的 Method 属性来设置传输方法。

文件系统限制

所有后台传输都需要本地文件路径。下载需要目标路径,该路径指定将保存下载的文件的位置。上传需要源路径,该路径指定将从中上传文件的位置。后台传输的所有本地路径都必须位于您应用程序的独立存储中,在名为“/shared/transfers”的根目录中。该目录是操作系统在安装应用程序时创建的,但如果应用程序删除或重命名该目录,则必须在启动任何文件传输之前重新创建该目录。您可以在“/shared/transfers”根目录下创建您选择的任何其他目录结构,并且可以在传输完成之后复制或删除文件,目的是确保后台传输服务不修改文件,但尝试使用“/shared/transfers”目录之外的路径启动传输将引发异常。

后台传输策略

操作系统对于与文件大小、连接速度以及设备资源有关的后台传输强制很多限制。本节列出了 Windows Phone 的后台传输策略。请注意,Windows Phone 模拟器模拟与 Wi-Fi 和外部电源相连的设备。若要验证应用程序是否在其他条件下工作,您应该在物理设备上进行测试。

大小

上传最大文件大小

通过手机网络连接 - 5 MB

通过 Wi-Fi 连接(使用电池)- 20 MB

通过 Wi-Fi 连接(使用外部电源)- 100 MB

通过手机网络连接的最大下载大小

20 MB - 如果超过此限制,则传输的 TransferPreferences 属性将自动更改为AllowBattery,它对需要 Wi-Fi 的传输有影响。

通过 Wi-Fi 而没有外部电源的最大下载大小

100 MB - 对于大于 100 MB 的文件,您必须将传输的 TransferPreferences 属性设置为None,否则传输将失败。如果您不知道传输的大小,而且它有可能超出限制,那么您应将该值设为 None,这意味着传输将只在手机与外部电源连接而且具有 Wi-Fi 连接时进行。

限制

每个应用程序的队列中未完成的最大请求数(这包括活动和挂起的请求)。

25 - 完成后不会自动从队列中删除传输。应用程序应该使用Remove(BackgroundTransferRequest) 从队列中删除完成的传输,以便为新的传输留出空槽。

设备上所有应用程序的最大并发传输数

2

设备上所有应用程序的最大排队传输数

500

每个请求的最大 HTTP 标头数

15

HTTP 标头的最大大小

每个 16 KB

策略

● 当应用处于前台时,后台传输服务将在以下数据网络上进行传输。当应用不处于前台时,传输将不在这些网络上进行。HttpWebRequest 对象同样有此限制,因此从这一方面看,执行自己的传输确实比使用后台传输有优势。

o  2G、EDGE、标准 GPRS

在 3G 和更高的网络中,假设所有其他条件都符合,那么无论应用是否正在前台运行,后台传输都将继续。

● 服务器端所需的文件内容长度标头大于 5 MB。服务器应该始终在响应中返回内容长度。不这样做可能会导致严重降低传输的性能。

● 服务器端所需的文件范围标头大于 5 MB。服务器应该始终支持范围请求标头。不这样做可能会导致严重降低传输的性能。

● 当节电模式功能开启且电量低于阈值时,系统会进入节电模式(电池图标上会显示♥符号),此时除了电话和短信以外的所有后台任务都会关闭,后台传输也都会停止,只有在应用程序打开时才能运行。

慢速传输

如果设备的网络连接速度低于以下速率,则会暂停传输并重试。这些限制(单位为 Kb/s)比较低,因此通常不会达到。

网络媒介

最低数据速率

3G

50 Kbps

Wi-Fi/USB

100 Kbps


计划通知

“计划通知”允许应用注册在预定义时间在前台中弹出的定期和一次性闹钟和提醒。用户体验类似于内置日历应用实现的提醒。用户点按闹钟或提醒会启动您的应用。

快速应用程序恢复

如果应用被挂起,而用户重启应用,如通过点按应用列表中的应用名称或点按应用的主要开始图块,那么默认情况下,应用的旧实例将终止,应用的全新实例将创建出来。该过程比恢复已挂起的应用慢,而且用户体验也不一样。Windows Phone 8 引入了应用程序快速恢复特性,当用户导航离开应用程序时,应用程序将被挂起,其状态保留在内存中。如果用户通过按“后退”按钮或使用“任务切换器”返回应用程序,那么应用实例将恢复。因为应用被保留在内存中,所有应用可以快速恢复至用户导航离开时的状态。

启用“快速恢复”很容易。只需对应用清单文件进行微小的更改。但是,一旦您启用了“快速恢复”,当您的应用恢复时,对于应用如何管理之前所访问的页面的后退堆栈,有几个不同的选项。若要启用您的应用的“快速恢复”,则在 WMAppManifest.xml 中,将 ActivationPolicy 特性添加至DefaultTask 元素,并且将值设为“Resume”。

实现“快速恢复”时,您应确定从手机上可用的不同启动点启动时,您的应用的最佳用户体验是什么。

● 主要启动点将用户带到应用的主页。主要启动点包括“开始”屏幕上应用的主要图块、应用列表中的应用名称或游戏中心。

● 深层链接将用户导航至应用内的其他页。深层链接包括次要图块、Toast 通知、可扩展性点(如搜索)或照片中心。

对于 Windows Phone 应用,系统保持用户在应用内已访问的页面历史记录,这让用户可以使用“后退”按钮向后导航堆栈至之前访问的页面。通过“快速恢复”,当应用恢复时,系统为启动点目标创建新的页面实例,而且该页面放置在应用现有后退堆栈的顶部。在这种情况下,应用可以选择清除现有后退堆栈,而仅保留堆栈上新建的页面。在这种情况下,用户体验将如同“全新”的应用启动。如果他们从已恢复的应用向后导航,而历史记录中并无页面,那么他们将返回“开始”屏幕或之前的应用。处理“快速恢复”的另一种方式是取消导航至新建页面。在这种情况下,用户将到达他们最后浏览的应用页面,之前会话的后退堆栈将保持完整。看起来如同仅是他们之前的应用会话恢复了。

快速应用程序切换

在 Windows Phone 中,当用户导航离开时,应用通常会处于休眠状态。在休眠状态下,应用会保存在内存中,因此,当用户返回到应用时,应用几乎可以立即恢复。应用无需实现任何代码就可以实现快速应用切换;该功能是自动启用的。但是,应用在处于休眠状态时可能会终止。您一定要对您的应用进行设计,以便它能够处理这些出现在整个应用生命周期中的状态变更。

说明:

multiple devices 低内存设备 上支持快速应用程序切换。然而,由于为进行快速应用程序切换而将应用保持在休眠状态要依赖于手机的可用内存,因此,相比运行在具有更多内存的手机上的应用,对运行在 低内存设备 上的同一应用的终止和逻辑删除将更快更频繁。

Windows应用商店应用的后台任务

后台任务是 Windows 在后台运行的轻型类。你可以使用后台任务在应用挂起或未运行时提供功能。也可以将后台任务用于实时通信应用,例如 VOIP、邮件和 IM。

后台任务是实现 IBackgroundTask 接口的单独的类。Windows 应用商店应用使用 BackgroundTaskBuilder 类注册后台任务。注册后台任务时将此类名称作为入口点指定。

后台任务资源限制

后台任务时轻型的。使后台执行最少可确保前台应用的最佳用户体验以及最佳电池寿命。通过对后台任务应用资源限制来实施该操作:

● CPU 的使用限制如下。

CPU 使用配额

刷新时间

应用不在锁屏上

1 秒

2 小时

应用位于锁屏上

2 秒

15 分钟

● 当使用电池(直流电源)运行时,后台任务还具有网络数据使用限制。此限制是网络接口所用能量的函数,因此它因设备和网络环境而异 - 但这个量可以估计。

下表描述了网络数据吞吐量特性,假定 WiFi 网络的资源限制为每数据吞吐量 1Mbps。为了估计正确的限制,请乘以连接的每秒平均 Mb 数 (Mbps)。例如,如果应用位于锁屏上,则在 10Mbps WiFi 连接条件下该应用每 2 小时可以使用 25 MB 数据。示例 WiFi 接口假定干扰最少。

刷新周期

15 分钟

2 小时

每天

数据限制(在锁屏上)

0.469 MB

不适用

45 MB

数据限制(不在锁屏上)

不适用

0.625 MB

7.5 MB

注意 当插入设备(交流电源)时,网络数据使用限制将增加,但 CPU 的使用配额仍适用。同样的,CPU 和网络资源约束由于应用的后台任务而挂起时,用户与该应用的交互仍在前台。

后台任务指南

CPU 和网络配额

不要超过适用于你的后台任务的 CPU 配额或网络数据使用配额。后台任务应该是轻型的任务以延长电池寿命并为前台应用提供最佳用户体验。有关适用于后台任务的资源限制,请参阅使用后台任务支持应用

管理后台任务

你的应用应该获取已注册后台任务的列表,注册进度和完成处理程序以及相应地处理这些事件。你的后台任务类应该报告进度、取消以及完成。有关详细信息,请参阅如何获取待完成后台任务的列表如何处理取消的后台任务如何监视后台任务进度和完成情况

使用BackgroundTaskDeferral

如果后台任务类运行异步代码,则确保使用延迟。否则,当 Run 方法完成时,你的后台任务可能会被提前终止。有关详细信息,请参阅 快速入门:创建和注册后台任务

或者也可以请求一个延迟,并使用 async/await 来完成异步方法调用。在 await 方法调用之后关闭延迟。

更新应用清单

在应用程序清单中声明每个后台任务及其使用的触发器类型。否则,你的应用将不能在运行时注册后台任务。有关详细信息,请参阅如何在应用程序清单中声明后台任务

准备应用更新

如果你的应用将更新,请创建和注册一个 ServicingComplete 后台任务,以帮助在前台运行的上下文之外执行所需的应用更新。

支持锁屏的应用的后台任务

锁屏是一个共享的资源。一次只能在锁屏上放置 7 个应用,并且只有一个应用可以显示宽磁贴。你的应用可以通过使用 RequestAccessAsync 方法请求锁屏访问,同时确保你的应用即使不在锁屏上也仍然工作来提供最佳用户体验。未使用锁屏的应用仍可以更新磁贴,更新锁屏提醒,发送通知以及注册系统事件触发器。当应用位于前台时的用户体验应该从不中断,即使用户未将应该放置在锁屏上也是如此。

请阅读锁屏概述以了解锁屏是否适合你的应用。

后台任务清单

以下清单适用于所有后台任务。

● 将后台任务与正确的触发器关联。

● 添加条件以帮助确保你的后台任务成功运行。

● 处理后台任务进度、完成以及取消。

● 请勿通过后台任务显示 UI,但 Toast、磁贴以及锁屏提醒更新除外。

● 在 Run 方法中,为每个异步方法调用请求延迟并在完成该方法时关闭它们。

或者,通过 async/await 使用一个延迟。

● 使用永久性存储在后台任务与应用之间共享数据。

● 在应用程序清单中声明每个后台任务及其使用的触发器类型。确保入口点和触发器类型正确。

● 编写生存时间较短的后台任务。请勿超过使用后台任务支持应用中显示的 CPU 或网络配额。

● 不要依赖后台任务中的用户交互。

● 请勿在清单中指定 Executable 元素,除非使用的是应运行在与应用相同的上下文中的触发器。

支持锁屏的应用的后台任务清单

当开发可以使用锁屏的应用的后台任务时,请遵循此指南。遵循锁屏磁贴指南和清单中的指南。

● 在将你的应用作为可锁屏应用进行开发之前,确保该应用位于锁屏上。有关详细信息,请参阅锁屏概述

● 确保你的应用在未置于锁屏上时也能工作。

● 使用 RequestAccessAsync 方法请求锁屏访问。

● 包含使用 PushNotificationTriggerControlChannelTrigger 或 TimeTrigger 注册并在应用清单中声明的后台任务。确保入口点和触发器类型正确。 这是认证所需的内容,它使得用户能够将应用置于锁屏上。

● 编写生存时间较短的后台任务,即使为可锁屏的应用编写后台任务也是如此。请勿超过使用后台任务支持应用中显示的 CPU 或网络配额。

另请参见

Windows Phone的后台代理最佳做法

如何实现Windows Phone的后台代理

后台任务指南(Windows 应用商店应用)

使用后台任务支持应用(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)

举报
顶部