本例演示了如何使用后台传输服务来进行后台文件下载,也就是说及时App已经停止运行,同样可以通过后台代理进行文件的下载操作。

对于后台文件传输一下知识点必须注意:

1. 通过使用 BackgroundTransferRequest 对象的 Method 属性来设置传输方法, Get, Post。

2. 后台传输的所有本地路径都必须位于您应用程序的独立存储中,在名为“/shared/transfers”的根目录中。

3.由于多个应用程序可能已排列后台传输,因此在先前添加的传输完成之后、传输开始之前可能有额外的延迟。

4. BackgroundTransferRequest 对象的 Headers 属性用于设置传输请求的 HTTP 标头。后面header item不可修改(If-Modified-Since,If-None-Match,Unless-Modified-Since,Range。。。)

5. 诸多限制:


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

大小

 

上传最大文件大小

5 MB

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

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

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

100 MB – 大于 100 MB 的文件必须将传输的 TransferPreferences 属性设置为 None,否则传输将失败。如果不知道传输文件的大小,则其有可能会超出该限制,您应将值设置为 None。

限制

 

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

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

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

2

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

500

每个请求的最大 HTTP 标头数

15

HTTP 标头的最大大小

每个 16 KB

策略

  • 在非并发语音和数据网络上不运行后台传输服务,其中包括:

    • 2G、EDGE、标准 GPRS

    后台传输服务在 3G 以及更高版本的网络上运行。

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

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

慢速传输

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

 

网络媒介

最低数据速率

3G

50 Kbps

Wi-Fi/USB

100 Kbps

  • 代码实现

1. 创建后台下载任务的特定目录

            using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!isoStore.DirectoryExists("/shared/transfers"))
{
isoStore.CreateDirectory("/shared/transfers");
}
}

2. 创建BackgroundTransferRequest对象,并且初始化request各项请求属性

            string transferFileName = ((Button)sender).Tag as string;
Uri transferUri = new Uri(Uri.EscapeUriString(transferFileName), UriKind.RelativeOrAbsolute); // 创建transfer request,
BackgroundTransferRequest transferRequest = new BackgroundTransferRequest(transferUri); // GET and POST are supported.
transferRequest.Method = "GET"; // 获取下载文件到 "transfers" 目录
string downloadFile = transferFileName.Substring(transferFileName.LastIndexOf("/") + );
Uri downloadUri = new Uri("shared/transfers/" + downloadFile, UriKind.RelativeOrAbsolute);
transferRequest.DownloadLocation = downloadUri; // 自定义tag
transferRequest.Tag = downloadFile;

3. 设置 WIfi,外接电源等相关信息到request

            if (wifiOnlyCheckbox.IsChecked == false)
{
transferRequest.TransferPreferences = TransferPreferences.AllowCellular;
}
if (externalPowerOnlyCheckbox.IsChecked == false)
{
transferRequest.TransferPreferences = TransferPreferences.AllowBattery;
}
if (wifiOnlyCheckbox.IsChecked == false && externalPowerOnlyCheckbox.IsChecked == false)
{
transferRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery;
}

4. 注册Request相关事件处理 (下载进度,下载状态改变)

TransferStatus.Completed

TransferStatus.WaitingForExternalPower

TransferStatus.WaitingForWiFi

etc ....

                transferRequest.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(transfer_TransferStatusChanged);
transferRequest.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(transfer_TransferProgressChanged);
ProcessTransfer(transferRequest);

5. 添加到手机系统后台传输的队列(不一定能马上执行下载)

            try
{
BackgroundTransferService.Add(transferRequest);
}

例子:Background Transfer Service Sample的更多相关文章

  1. iOS7中的多任务 - Background Fetch,Silent Remote Notifications,Background Transfer Service

    转自:http://onevcat.com/2013/08/ios7-background-multitask/ 在IOS 7 出来不就,公司内部也组织了一次关于IOS 7 特性的的分享,今天看见on ...

  2. 例子:Background Audio Streamer Sample

    The Background Audio Streamer sample demonstrates how to create an app that uses a MediaStreamSource ...

  3. 例子:RSS Reader Sample

    本例演示了Rss xml信息的获取,以及如何使用SyndicationFeed来进行符合Rss规范的xml进行解析. SyndicationFeed 解析完成后 可以得到SyndicationItem ...

  4. 例子:Execution Model Sample - 应用状态保存

    WP中,当你的应用被切换到后台 后,就进入了休眠状态,然后当一个应用从墓碑恢复时,如何恢复相应的状态,该例子就演示了如何保存和恢复UI以及APP相关状态. 这里有一篇很好的文章,请参见: http:/ ...

  5. soapui中文操作手册(七)----Web Service Sample Project

    REST推理 这份简短的教程将引导您完成架构推断功能. 我们将创建一个新的项目,并添加一个REST服务,而初始WADL文件启动了. 发送请求后,我们就可以使用响应来构建我们的架构. 演示请求 为了演示 ...

  6. pytorch例子学习——TRANSFER LEARNING TUTORIAL

    参考:https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html 以下是两种主要的迁移学习场景 微调convnet : ...

  7. [UE4] C++实现Delegate Event实例(例子、example、sample)

    转自:http://aigo.iteye.com/blog/2301010 虽然官方doc上说Event的Binding方式跟Multi-Cast用法完全一样,Multi-Cast论坛上也有很多例子, ...

  8. 例子:Basic Lens sample

    本例演示了如何自己扩展一个Camera Lens. 1. UI界面是一个MediaViewer <controls:MediaViewer x:Name="MediaViewer&qu ...

  9. iOS 多任务

    本文转自猫神的博客:https://onevcat.com/2013/08/ios7-background-multitask/ 写的没的说,分享给大家,一起学习! iOS7以前的Multitaski ...

随机推荐

  1. 【IOS 开发】Object - C 入门 之 数据类型详解

    1. 数据类型简介及输出() http://www.把下面的替换我.com/html/topnews201408/79/1279.htm csdn123

  2. 远程重装centos6

    写得比较简略,也是综合网络上的文章,总结一下实操的经验 获取启动内核 wget -P /boot/ http://mirrors.163.com/centos/6.8/os/x86_64/images ...

  3. js邮箱自动补全

    邮箱自动补全js和jQuery html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  4. Javascript优化后的加减乘除(解决js浮点数计算bug)

    function add(a, b) { var c, d, e; try { c = a.toString().split(".")[1].length; } catch (f) ...

  5. R语言实战(二)数据管理

    本文对应<R语言实战>第4章:基本数据管理:第5章:高级数据管理 创建新变量 #建议采用transform()函数 mydata <- transform(mydata, sumx ...

  6. VMware Workstation 10+Centos7(64位)共享文件夹

    这一两天一直在研究VMware Workstation自带的共享文件夹的功能,期间出了不少问题,在公司搭建的是vm10.0+centos07,在家搭建的是VM 7+centos07... 公司环境搭建 ...

  7. python爬取返利网中值得买中的数据

    先使用以前的方法将返利网的数据爬取下来,scrapy框架还不熟练,明日再战scrapy 查找目标数据使用的是beautifulsoup模块. 1.观察网页,寻找规律 打开值得买这块内容 1>分析 ...

  8. 分枝定界的matlab实现

    function [optSolution,optValue,exists]=BranchBound(c,A,b) % 分支定界法 % 整数规划问题标准型 % min c'*x % s.t. % A* ...

  9. Python基础笔记

    输入输出 输入input(),输入的字符以str作为结果,若要得到整数结果,需要进行数据类型转换,如a=int(input()). 输出print,格式化输出%s表示字符串替换,%d表示整数替换,%f ...

  10. web.config连接字符串的一些总结

    阅读目录: DS01:数据库连接字符串的两种写法 DS02:数据库连接字符串的内容 DS01:数据库连接字符串的两种写法 1.连接字符串的两种写法: <configuration>   & ...