原文:Windows Phone 8 - Runtime Location API - 2

在<Windows Phone 8 - Runtime Location API - 1>介绍基本的APIs资讯与操作元件,里面介绍面的内谷主要专注

在於App需在前景模式下,如果您希望App是做像常见的,例如:美食导航、慢跑路线、约会地点连结…等,

那麽接下来该篇将讨论如何在背景模式下持续取得座标资讯的能力。

?

[观念]

?WP上的App如果不在前景运作中(例如:开其他程式或按Start键回到桌面),该App是被暂停的;

??? 如果其他App需要更大的Memory被暂停的App可能会被关闭或进入tombstoned的;

??? 参考资料<App activation and deactivation for Windows Phone>。

?WP8允许如果app属於「location-tracking」类型,它被允许在背景模式下持续进行,这个与Background Agent

??? 属於不同的处理机制。

?实作「location-tracking」类型的App,自动支援Fast resume特性。

??? 参考<Fast app resume for Windows Phone 8>或<Windows Phone 8 – Launch Apps与Fast Resume>。

?由於app是执行於行动设备上,电力的考量是最重要的部分,所以在App执行於背景时需要特别注意:

??? a. 最小化次数/数量的网路请求;

??????? =>如果可以的话,应统合所有请求改用批次的方式或是固定时间区间来发出请求。

??? b. 如果使用TimerDispatcherTimer物件只为了更新前景的UI,请不要使用;

??? c. 停止使用所有的XAML动画;

??? d. 如果App并非常时间需要做背景执行,可以搭配PositionChanged与StatusChanged的事件来停止座标追踨;

?

?

[背景可用APIs]

?背景执行的App具有些限制但也有开发一些可用的APIs,

?? 可参考<Features that can be used while running in the background for Windows Phone 8>。

?? 例如:ShellToast、ApplicationModel.Store、Speech.Synthesis、Notification、IsolatedStorage、HttpWebRequest、Sockets…等。

?

?

〉Location-tracking被系统通知Deactivation的条件

??? WP为了维持系统的稳定性,虽允许Location-Tracking类型的App可在背景执行,但具某些条件时系统会通知

Deactivated事件给App加以关闭。Deactivated事件就跟一般应用程式在前景模式收到Deactivated事件相同,这点与

Background Agent是不同的。

?

根据<Running location-tracking apps in the background for Windows Phone 8>中介绍,被通知Deactivated的条件:

?

?App本身停止座标追踪能力。App可在PositionChangedStatusChanged事件搭配GeolocatorGeoCoordinateWatcher

??? 停止持续座标追踪。

?App处於背景执行4个小时,但没有用户加以互动。

?省电模式被启动。

?设备记忆体过低。

?用户关闭了设备的位置服务。

?其他应用程式开始在背景模式执行。

?

这些条件发生後系统触发Deactivated事件,可搭配事件中的Reason参数来加以了解是什麽状态。

在撰写好的App时这些条件最好均要测试,以免在送审过程被退件。

?

?

有了以上的观念後,往下便来看看<How to run location-tracking apps in the background for Windows Phone 8>要怎麽实作吧。

?

A. 在WMAppManifest.xml宣告必要的特性 ID_CAP_LOCATION与设定DefaultTask具有<BackgroundExecution />

?????

????? 在<DefaultTask />中宣告该App支援Background模式下的任务:

<Tasks>

  <DefaultTask Name="_default" NavigationPage="MainPage.xaml">

    <!-- 宣告为BackgroundExecution,固定的Name = LocationTracking -->

    <BackgroundExecution>

      <ExecutionType Name="LocationTracking" />

    </BackgroundExecution>

  </DefaultTask>

</Tasks>

????? 宣告使用的是<BackgroundExecution />与<BackgroundServiceAgent />二者不同,

????? 并且使用固定的Type Name:LocationTracking

?

?

B. 在App.xaml中覆写 shell:PhoneApplicationService 中的RunningInBackground事件

???? 在一般的App里 shell:PhoneApplicationService仅注册了四个事件:Launching、Closing、Activated与Deactivated。

???? 在此,增加了新的事件处理:RunningInBackground。它主要触发於当App执行於背景模式时。

???? 目前仅开放在location-aware型的App才可以有这样的功能。那麽一来需要将App.xaml修改成如下:

<Application.ApplicationLifetimeObjects>

   <!--Required object that handles lifetime events for the application-->

   <shell:PhoneApplicationService

       Launching="Application_Launching" Closing="Application_Closing"

       Activated="Application_Activated" Deactivated="Application_Deactivated"

       RunningInBackground="Application_RunningInBackground"/>

</Application.ApplicationLifetimeObjects>

?

?

C. 实作最重要的RunningInBackground事件

??? 在App.xaml.cs中宣告二个重要的变数:

??? ?Geolocator:用於同时储存App在前景与背景模式下所取得座标资讯;

??? ?RunningInBackground:用於识别目前处於前景或背景模式下;

???? 有了这二个变数的使用,便在Application_Activated与Application_RunningInBackground分别

???? 设定RunningInBackground的变数值,如下:

private void Application_RunningInBackground(object sender, RunningInBackgroundEventArgs args)

{

    RunningInBackground = true;

    // 当进入背景模式时,要记把相关UI更新或动画全部取消;

}

private void Application_Activated(object sender, ActivatedEventArgs e)

{

    RunningInBackground = false;

    // 回到前景时,则设定关闭背景的执行任务,以节省电力

}

???? 为何不写在Application_Launch呢?因为有可能用户是从暂存区开启程式它就不会经过Launch, 而Activated则不管是第一次开启或

???? 从暂存区返回均可以使用。

?

?

D. 根据范例建立一个Page用於放置当Geolocator取得座标资讯时用於显示座标的画面

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

    <StackPanel>

        <TextBlock x:Name="LatitudeTextBlock" Text="latitude"/>

        <TextBlock x:Name="LongitudeTextBlock" Text="longitude"/>

    </StackPanel>

</Grid>

?

?

E. 在该Page的OnNavigatedTo时,实例化Geolocator并注册PositionChanged的事件

protected override void OnNavigatedTo(NavigationEventArgs e)

{

    base.OnNavigatedTo(e);

?

    // 实例化宣告於App.xaml的Geolocator

    if (App.Geolocator == null)

    {

        App.Geolocator = 

                new Windows.Devices.Geolocation.Geolocator();

        App.Geolocator.DesiredAccuracy =

                 Windows.Devices.Geolocation.PositionAccuracy.High;

        App.Geolocator.MovementThreshold = 100;

        App.Geolocator.PositionChanged += Geolocator_PositionChanged;

    }

}

?

?

F. 实作在PositionChanged事件下,前景模式更新画面中的资料、背景模式下透过ShellToast通知座标已更新

void Geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)

{

    if (App.RunningInBackground == false)

    {

        //代表处於前景画面可以直接更新画面;

        Dispatcher.BeginInvoke(() =>

        {

            LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00");

            LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00");

        });

    }

    else

    {

        //代表处於背景模式,仅能利用ShellToas来通知;

        Microsoft.Phone.Shell.ShellToast toast = new Microsoft.Phone.Shell.ShellToast();

        toast.Content =string.Format("{0},{1}",

            args.Position.Coordinate.Latitude.ToString("0.00"),

            args.Position.Coordinate.Longitude.ToString("0.00"));

        toast.Title = "Location: ";

        toast.NavigationUri = new Uri("/Page2.xaml", UriKind.Relative);

        toast.Show();

    }            

}

?

?

G. 覆写重要的事件PhoneApplicationPage.OnRemovedFromJournal

??? 为什麽需要覆写这样的功能呢?为了就是当我们实作的Page是用於支援LocationTracking时,该页如果被关闭时,

注册於该页撷取Geolocator的事件需要被取消,以免造成不同Thread的Exception问题。而该事件会被呼叫,也代表该

Page已经被呼叫从journal移除掉了,例如:呼叫RemoveBackEntry()事件之後。

protected override void OnRemovedFromJournal(JournalEntryRemovedEventArgs e)

{

    //在该Page被移除之前,先取消注册处理PositionChanged的事件

    App.Geolocator.PositionChanged -= Geolocator_PositionChanged;

    App.Geolocator = null;

?

    base.OnRemovedFromJournal(e);

}

?

?

[执行画面]

(背景模式)(前景模式)

测试的方式我是使用Emulator加上Additional Tools一起模拟目前移动的座标位置。相关於如何使用Additional Tool来模拟座标,

可参以下的步骤:

?

[范例程式]

======

以上是分享如何实作LocationTracking的App,其中内容主要撷取MSDN上的内容来加以说明,

希望对大家有所帮助。

?

References

?Location for Windows Phone 8

?How to get the phone's current location for Windows Phone 8

?How to continuously track the phone's location for Windows Phone 8

?How to run location-tracking apps in the background for Windows Phone 8 (重要)

?Location Sample for Windows Phone 8

?Location Service Sample

?NET Location API for Windows Phone 8.

?Acquiring a single Geoposition in Windows Phone 8

?Windows Phone 8 and Windows 8 platform comparison

?Using the Location API in Your Windows Phone 8 Applications

?Features that can be used while running in the background for Windows Phone 8

?Fast app resume for Windows Phone 8 (重要)

?App activation and deactivation for Windows Phone (重要)

?Features that can be used while running in the background for Windows Phone 8 (重要)

?Maps in Windows Phone 8 and Phone toolkit: a winning team – Part 1

?Maps in Windows Phone 8 and Phone toolkit: a winning team – Part 2

?

Dotblogs 的标签:Windows Phone

enjoy developing application and learning new technology time.

DotBlogs Tags:

Windows Phone

posted on
2014/3/6 01:17
|

我要推荐

|
阅读数 : 131

| 文章分类 [

Windows Phone

]

|
订阅

Windows Phone 8 - Runtime Location API - 2的更多相关文章

  1. Windows Phone 8 - Runtime Location API - 1

    原文:Windows Phone 8 - Runtime Location API - 1 在Windows Phone里要做Background Service的方式,除了Background Ag ...

  2. Windows 和 Linux 的IPC API对应表

    原文出处:http://blog.csdn.net/zhengdy/article/details/5485472                                           ...

  3. windows service承载的web api宿主搭建(Microsoft.Owin+service)

    今天突然想起改良一下以前搭建的“windows service承载的web api”服务,以前也是直接引用的类库,没有使用nuget包,时隔几年应该很旧版本了吧.所以本次把需要nuget获取的包记录一 ...

  4. window.location API

    概述 今天被自己鄙视了,竟然不会用window.location.search进行页面传值.现在好好总结下window.location API,记录一下供以后开发时参考,相信对其它人也有用. 页面传 ...

  5. 微信小程序把玩(三十七)location API

    原文:微信小程序把玩(三十七)location API location API也就分这里分两种wx.getLocation(object)获取当前位置和wx.openLocation(object) ...

  6. js location API All In One

    js location API All In One location "use strict"; /** * * @author xgqfrms * @license MIT * ...

  7. 在 Windows 8、Windows 10 桌面模式下的 .NET Framework 程序中,引用 Windows.Runtime 的 API。

    参考:1.https://www.cnblogs.com/webtojs/p/9675956.html 2.http://jennal.com/2016/04/28/using-windows-run ...

  8. JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

    DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象 ...

  9. 【windows核心编程】一个API拦截的例子

    API拦截 修改PE文件导入段中的导入函数地址 为 新的函数地址 这涉及PE文件格式中的导入表和IAT,PE文件中每个隐式链接的DLL对应一个IMAGE_IMPORT_DESCRIPTOR描述符结构, ...

随机推荐

  1. ACdream 1135(MST-最小生成树边上2个值,维护第一个最小的前提下让还有一个最小)

    F - MST Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatu ...

  2. expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

    expdp时遇到ORA-31693&ORA-02354&ORA-01466 对一个schema运行expdp导出,expdp命令: nohup expdp HQ_X1/HQ_X1 DU ...

  3. MySQL在一台db服务器上面如何启动多个实例

    安装过程省略过,源码安装请参考http://write.blog.csdn.net/postlist/1609043/all 整理自己的文档,发现以前做的例子,share下,欢迎大家提出改进意见. 一 ...

  4. 【Bug Fix】Error : Can&#39;t create table &#39;moshop_1.#sql-534_185&#39; (errno: 150)

    运行alter操作, alter table xx_shop_info add index FK9050F5D83304CDDC (shop_area), add constraint FK9050F ...

  5. wx_sample.php

    <?php /**   * wechat php test   */ //define your token define("TOKEN", "weixin&quo ...

  6. Wix打包系列(四) 自定义UI

    原文:Wix打包系列(四) 自定义UI 除了标准的安装界面,如果我们要在安装时需要提供一些额外的信息时,这时就需要自定义界面来显示和录入这些信息. 4.1  自定义对话框 如上一章中我们测试数据库的连 ...

  7. 使用MYCAT作为Mysql HA的中间件(转)

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...

  8. JavaScript中的对象(一)

    Email:longsu2010 at yeah dot net 最近我和朋友谈起JavaScript中对象的问题.朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某 ...

  9. SPOJ 375(树链剖分)

    题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#problem/I 题意:一棵包含N 个结点的树,每条边都有一个权值, ...

  10. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...