Windows Phone 8开发入门(六)



主要内容:后台代理

后退堆栈

操作返回堆栈

Private void PurgeBackStackButton_Click(object sender,RoutedEventArgs e)

{

WhileNavigationService.CanGoBack)

NavigationService.RemoveBackEntry();

}

RemoveBackEntry方法用于从后退堆栈中移除最近的条目,如果没有要移除的条目,则引发InvalidOperationException.如果您想移除多个项目,则多次调用此方法。此API是同步的,因此必须从UI线程调用。

使用后退堆栈

使用新页面替换当前页面

删除所有页面

清除整个页面后退堆栈并替换为给定页面。

 

前台任务

一般Windows phone应用程序是运行在“前台”

任何时间只能有一个应用运允许运行在前台

目的是保证最佳的用户体验和延长手机电量使用时长

 

后台代理

后台代理

Windows Phone应用程序可启动一个后台代理为其服务

可以定期代理或者资源密集型代理

每一个应用程序只允许使用一个代理

后台代理都允许应用程序在后台执行代码,即使当应用程序未在前台运行时也是如此

不同类型的计划任务是针对不同类型的后台处理方案设计的,具有不同的行为和限制

后台代理使用警告

Windows Phone操作系统限制了同时激活的代理的数量

除非在适当的条件下调用,否则代理可能不会启用

后台代理只在操作系统认为资源足够时,方可运行

如果手机处于节电模式状态下,那么所有的后台代理将被终止

用户可以管理其手机上的每个应用的后台代理,选择启用或者禁用

代理和任务

不同类型的计划任务是针对不同类型的后台处理方案设计的,因此具有不同的行为和限制

两种类型的任务

Priodic tasks定期代理

Resource intensive tasks资源密集型代理

代理的代码由应用程序在从BackgroundAgent继承的类中实现。代理启动时,操作系统调用OnInvoke(ScheduledTask).在该方法中,应用程序可以确定它以哪种ScheduleTask类型运行,并执行相应的操作。

定期代理(PeriodicTask Agents)

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

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

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

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

资源密集型代理(ResourceIntensive Agents)

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

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

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

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

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

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

不能将网络更改为手机网络,即如果资源密集型代理尝试调用指定MobileBroadbandGSM()MobileBroadbandCDMA()AssociateToNetworkInterface(Socket,NetworkInterfaceinfo),则该方法调用失败。

后台代理功能

允许

Tiles

Toast

Location

Network

R/W ISO store

Sockets

限制

Display UI

XNA libraries

Microphone and camera

Sensors

Play audio(may only use background audio APIs)

在后台运行Windows Phone 8的位置跟踪

Windows Phone 8上,在用户导航离开之后,只要位置跟踪应用持续活跃地跟踪位置,它就可以持续在后台运行

此功能支持诸如提供逐向导航的应用这样的方案

对于在移动设备上运行的应用,耗电量是一个重要注意事项。在后台运行应用时,您可以采取一些步骤降低电池消耗,进而提高用户对应用的满意度

创建后台代理

Add new project-->Windows Phone -->Windows PhoneSecheduled Task Agent-->创建LocationLogTaskAgent工程

Captions Log Solution

解决方案中包含两个工程

LocationLogger:Windows Phone工程---启动程序所在的工程

LocationLogTaskAgent:位置跟踪的后台代理工程

解决方案中可包含多个不同类型的工程

连接后台代码的工程

CaptainLog工程引用了后台代理LocationTaskAgent工程

前台的应用不会直接在代码中引用dialing的类

然而,我们必须明确的连接两个应用,为此在CaptainsLog工程引用LocationTaskAgent的输出

后台代理代码

Namespace LocationLogTaskAgent

{

Public class ScheduledAgent:ScheduledTaskAgent

{

Protected override void OnInvoke(ScheduledTask task)

{

NotifyComplete();

}

}

}

我们必须在OnInvoke方法中实现代理功能

当其完成时通知系统

后台代理的数据分享

Protected override void OnInvoke(ScheduledTask task)

{

String message="";

String logString="";

If(LoadLogFromIsolatedStorageFile()

{

Message="Loaded";

}

Else{

Message="Initialised";

}

……

}

第一件事情代理完成的就是从独立存储空间加载日志字符串

在日志的末尾加上当前的位置信息

数据访问

Public bool LoadLogFromIsolatedStorageFile()

{

Mut.WaitOne();//wait until it is safe to enter

Try{

//read the file here

Return true;

}

Catch{

LogText="";

Return false;

}

Finally{

Mut.ReleaseMutex();//release the Mutex.

}

通过互斥保护访问独立存储空间的文件

访问结束后释放互斥

显示通知

Protected override void OnInvoke(ScheduledTask task)

{

……

ShellToast toast =new ShellToast();

Toast.Title="Location Log";

Toast.Content=message;

Toast.Show();

……

}

后台任务可以发送Toast通知的消息

如果用户轻触通知消息,则则会启动前台的应用

Toast通知消息在前台主应用启动时不会显示

计划任务

PeriodicTask  t;

t=SecheduledActionService.Find(taskName) as PeroidicTask;

Bool fond=(t!=null);

If(!found)

{

t=new PeriodicTask(taskName);

}

t.Description=description;

t.ExpirationTime=DataTime.Now.AddDays(10);

If(!found)

{

ScheduledActionService.Add(t);

}

Else

{

ScheduledActionService.Remove(taskName);

ScheduledActionService.Add(t);

}

调试后台任务

#if DEBUG_AGENT

ScheduledActionService.LaunchForTest(taskName,TimeSpan.FromSeconds(60);

#endif

如果调试代码时,我们需要等待30分钟看后台代理的执行结果,那么将是非常令人懊恼的

如果我们正在调试代码,可以强制启动代理服务

这样的代码可以在Release编译时被有条件的排除

后台代理最佳做法

最小化网络请求的次数和频率

停止活动的TimerDispatcherTimer对象,如果它们仅用于前台功能(如UI )

停止所有XAML动画

如果应用程序不再需要在后台运行,通过移除Geolocator类的PositionChangedStatusChanged事件的事件处理程序或通过调用GeoCoordinateWatcher类的Stop()方法停止跟踪位置

后台文件传输

可创建后台文件传输的任务从独立存储空间传送文件

即使应用没有运行,传输仍旧可以运行

应用程序可监视下载状态,并显示其进度

后台传输服务仅支持使用HTTPHTTPS的传输,不支持FTP

应用程序管理传输任务的队列

应用可查询激活的传输状态

后台传输用户界面最佳做法

后台文件传输应该有用户启动,如通过点击某个按钮

您必须提供允许用户查看所有后台传输的状态和传输进度的UI

必须提供用户取消任何以及所有当前传输的机制

使用将文件传输限制为仅通过Wi-Fi以及在连有外部电源时进行的默认传输首选项。可以使用TransferPreferences属性设置用户的选择

如果后台传输的状态为WaitingForExternalPower,WatingForExternalPowerDueToBatterySaverMode,WatingForWiFiWatingForNonVoiceBlockingNetWork,则向用户提供一个消息,通知他们传输正在等待的原因(恢复传输的步骤)

后台传输应遵循的建议

在关联的传输操作完成之前,不要尝试访问或修改“/shared/transfers”目录中的目标文件

BackgroundTransferRequest对象的Tag属性可用于将关联的自定义数据与某个传输关联

访问Requests属性时,会创建BackgroundTransferRequest的新实例。建议

为防止内存泄露,建议您避免经常(如在某个游戏循环中)访问此属性来查询请求数量

只要不再使用返回的对象,就迅速处置它们。相同的建议也适用于Find(String)方法,该方法在找到提供的传输ID时将创建新的实例

TransferStatusChangedTransferProgressChanged事件的事件处理程序应该快速返回以便用户界面不会变得行动迟缓。从独立存储中读取以及向独立存储中写入的速度可能很慢,如果有可能的话,应该在单独的工作线程上执行

TotalBytesToReceive属性指示文件下载的总大小。如果该值为-1,则表示文件大小未知。

服务器应该在HTTP响应标头中返回内容长度,以便让用户知道传输的大小和进度

服务器必须支持来着客户端的Range请求以改进性能。后台传输有可能会在进行时暂停和恢复。不支持Range请求将导致性能降低,因为传输一旦暂停,必须重新启动

建议您在浏览器中或者通过后台传输应用程序外部的某一个其他机制测试服务器端功能以确保正常工作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值