Упражнение 2. Приложение Running TrackerПока что наше приложение не использует службы определения местоположения, чтобы прокладывать маршрут из одной точки в другую. Вместо этого оно обращается к статистическому набору координат начальной и конечной точек маршрута, жестко заданных в коде C#. В этом задании мы добавим в приложение поддержку определения местоположения. Чтобы добавить в Running Tracker эту функцию и отображать соответствующие данные на карте, нужно изменить манифест приложения. Наконец, мы добавим в приложение поддержку фонового режима. Примечание. В этом упражнении мы будем использовать код, созданный нами в предыдущем упражнении, и поэтапно вносить в него изменения. Если вы пропустили предыдущее упражнение и начинаете работу с данного практического занятия, используйте решение Begin. Это решение расположено в установочной папке Sources\EX2 – Location Services\Begin. Задание 1. Изменение манифеста приложения Задача приложения — отслеживать местоположение пользователя во время движения. Это означает, что приложение должно оставаться активным в течение всей пробежки. Все это время телефон использоваться не будет либо пользователь откроет другое приложение. По умолчанию при запуске другой программы наше приложение деактивируется и прекратит отслеживать маршрут, время и дистанцию, пройденную пользователем. Чтобы приложение отслеживало местоположение пользователя в фоновом режиме, следует изменить манифест приложения.
Теперь приложение будет оставаться активным в фоновом режиме и отслеживать местоположение пользователя. Приложение для отслеживания местоположения работает в Windows Phone 8 в фоновом режиме, даже если пользователь запустил другое приложение. 7. Теперь приложение готово к внесению следующих изменений. Задание 2. Использование служб определения местоположения и управление фоновым режимом выполнения Начиная с этого момента приложение будет использовать реальную информацию о местоположении вместо эмулированных статических координат, которые мы создали в предыдущем задании. Мы изменим несколько методов, а также модифицируем пользовательский интерфейс, чтобы на экране отображалась информация о движении пользователя.
2. Данный код регистрирует обработчик событий для события RunningInBackground, который следует добавить в файл кода программной части. Откройте файл App.xaml.cs и добавьте в класс следующий метод обработчика событий: 3. Добавьте в класс следующее статическое поле: 4. Найдите и откройте файл MainPage.xaml. 5. Найдите элемент ContentPanel Grid и добавьте следующий код сразу же перед закрывающим тэгом “</Grid>” : Примечание. Этот код определяет привязку данных в полях Mileage (Расстояние) и Runtime (Время пробежки), которые мы создадим далее. Чтобы получить больше информации о привязке данных, см. документацию по Windows Phone. 6. Найдите и откройте файл MainPage.xaml.cs. 7. В самом начале класса добавьте следующие выражения using: 8. Удалите определенные в классе константы: SourceLatitude, SourceLongtitude, DestinationLatitude, DestinationLongtitude. 9. Добавьте следующие поля вместо удаленных: Константа KM_MILE служит для пересчета расстояния из метров (которые возвращает класс RouteQuery) в мили. GeoCoordinateWatcher (из пространства имен System.Device.Location) реализует службу определения местоположения Windows Phone 8. Она будет следит за движением пользователя. MapLayer, MapOverlay и MapPolyline — это классы из пространства имен Microsoft.Phone.Maps.Controls, которые помогут указывать маршрут пробежки на карте. Класс MapLayer представляет уровень, указанный в верхней части элемента управления картой, где отображается коллекция объектов MapOverlay. Класс MapOverlay содержит коллекцию элементов пользовательского интерфейса UIElements и помогает позиционировать их с помощью географических координат. Класс MapPolyline — это ломаная линия (она состоит из нескольких прямых сегментов) на элементе управления картой, отображающая маршрут пользователя. Наконец, список positions служит для сбора данных о местоположении, полученных во время пробежки, и расчета расстояния, которое пользователь пробежал на данный момент. 10. В конце класса MainPage добавьте следующий код: Данный код добавляет два свойства зависимостей, которые позволят отображать движение пользователя по маршруту (пройденное им расстояние). 11. Чтобы обеспечить привязку данных к экранным элементам и свойствам, добавленным в предыдущих фрагментах кода, откройте конструктор класса и добавьте следующую строку после вызова метода InitializeComponent: 12. Найдите метод OnNavigatedTo. В начале метода инициализации GeoCoordinateWatcher добавьте следующий код: Этот код создает новый экземпляр класса GeoCoordinateWatcher и требует высокой точности результатов, необходимых для отслеживания местоположения пользователя. Кроме того, данный код осуществляет подписку на события PositionChanged и StatusChanged. 13. Далее в методе OnNavigatedTo найдите строки, которые меняют routeQuery.TravelMode и осуществляют подписку на событие routeQuery.QueryCompleted, и замените их следующим кодом:В первую очередь этот код отвечает за то, что фоновый режим приложения не включается вплоть до выполнения инициализации. Примечание. Когда приложение для отслеживания местоположения работает в фоновом режиме, оно остается активным, то есть при выходе из фонового режима не требует повторной инициализации. Переменная txtCurrentSpeed — это элемент TextBlock, который динамически добавляется в элемент управления картой и отображает текущую скорость. После инициализации объекта RouteQuery код инициализирует новый объект MapLayer, который используется для отображения маршрута, скорости и пройденных точек в элементе управления картой. 14. Далее добавьте код, реализующий обработчик событий StatusChanged для класса GeoCoordinateWatcher:Данный фрагмент кода — это консоль вывода данных Debug с новым состоянием местоположения (мы будем использовать ее в задании 3). Когда службы определения местоположения будут готовы, консоль центрирует карту в соответствии с текущим местоположением. Затем данный метод готовит карту, переменные и элементы пользовательского интерфейса для новой пробежки. 15. Далее добавьте код, реализующий обработчик событий PositionChanged для класса GeoCoordinateWatcher:Этот метод вызывается каждый раз, когда службы определения местоположения предоставляют новые сведения о местоположении. Он отвечает за центрирование карты в текущем местоположении пользователя, расчет и отображение текущего времени и скорости, а также отрисовку маршрута на карте. Реализованный в предыдущем задании последний сегмент вызывает асинхронный метод QueryAsync в члене routeQuery с новой промежуточной точкой только в том случае, если RouteQuery не занят обработкой предыдущего запроса. 16. Далее измените обработчик события QueryCompleted, созданный в предыдущем упражнении. Найдите метод rq_QueryCompleted и замените его следующим кодом: Теперь метод рассчитывает общее время пробежки и расстояние и присваивает его свойствам, объявленным в начале данного задания. Примечание. Свойства Mileage и Runtime привязаны к текстовым блокам экрана, благодаря чему информация на экране обновляется автоматически каждый раз, когда эти свойства присваиваются кодом. 17. В предыдущем задании использовалась только кнопка Start, которая запускала сессию во время пробежки. Теперь мы внедрим полный механизм Start/Stop в том виде, в котором он был спроектирован изначально. Чтобы это сделать, найдите метод обработчика событий btnStartStop_Click и замените его следующим кодом: Данный код запускает метод GeoCoordinateWatcher, если пользователь стоит, либо останавливает код, если в настоящее время приложение отслеживает местоположение (т. е. пользователь бежит). 18. Теперь можно скомпилировать и запустить приложение. Чтобы протестировать его, перейдите к следующему заданию. Задание 3. Тестирование приложения Чтобы протестировать приложение, нам потребуется эмулировать изменения местоположения, которые сообщает служба определения местоположения. Мы можем использовать физическое устройство под управлением Windows Phone 8, но проще применить эмулятор Windows Phone 8. Эмулятор моделирует движение пользователя и поможет нам протестировать службы определения местоположения.
|