Country not specified
Unknown website Share

Apps4all

Страна: -
Город: -
Был онлайн: -
О себе:
 
08-07-2016, 11:49
Apps4all

Windows Phone 7.5 Mango: Топ 10 функций для разработчиков мобильных приложений

Экосистема Windows Phone стала более зрелой. С выпуском Windows Phone 7.5 ("Mango") в конце сентября 2011 года, разработчики получили множество новых функций для создания качественных приложений. Они уже давно требовали этих функций. Так что если ты создаешь приложения для Windows Phone 7, и тебе не хватает функционала, то платформа Mango создана именно для тебя. Ниже представлен список из 10 лучших функций Windows Phone 7.5, которые непременно пригодятся разработчикам.

#10: Функции Silverlight 4

Как разработчик для Silverlight, я был очень рад тому факту, что Windows Phone создан на основе Silverlight. Но как человек, который большую часть времени проводил за написанием под Silverlight 4, мне пришлось приспосабливаться к отсутствию функций, к которым я так привык:

  • неявный стиль;
  • функции привязки данных:
    o StringFormat
    o FallbackValue
    o TargetNullValue
    o IDataErrorInfo
    o INotifyDataErrorInfo
  • поддержка ICommand
  • CompositeTransform
  • поддержка OData

Я рад сообщить, что Windows Phone 7.5 поддерживает эти функции Silverlight 4, а теперь еще предлагает поддержку API веб-камер Silverlight 4.

#9: Смешанные проекты XNA/Silverlight

Проекты Microsoft XNA в основном используются для создания игр под Windows Phone. Но у XNA есть одно слабое место: создание экранов управления. Создавать экраны меню и другие части пользовательского интерфейса с XNA сложнее, чем можно себе представить. И здесь на помощь приходит гибридный проект приложения Windows Phone Silverlight и XNA.

В этом новом проекте приложение, созданное в Silverlight, добавляет необходимые элементы для поддержки конвейеров контента и игровых циклов. По умолчанию новый проект создает отдельные страницы Silverlight и Game для  поддержки подхода, при котором Silverlight применяется для страниц навигации и поддержки рендеринга XNA на отдельных страницах. Например, для страницы XNA в одном из таких проектов создается PhoneApplicationPage, но не определяется ни один из внутренних XAML, так как вся страница рендерится с использованием XNA. Сначала тебе нужно использовать игровой цикл на странице XNA. Шаблон добивается этого за счет создания игрового цикла в конструкторе, создавая объект GameTimer, и используя методы Update и Draw, к которым привыкли разработчики под XNA.

public GamePage()
{
  InitializeComponent();

  ...

  // Create a timer for this page
  timer = new GameTimer();
  timer.UpdateInterval = TimeSpan.FromTicks(333333);
  timer.Update += OnUpdate;
  timer.Draw += OnDraw;
}

Затем шаблон использует класс SharedGraphicsDeviceManager для передачи данных между Silverlight и XNA на определенной странице.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  // Get the current graphics device
  var graphics = SharedGraphicsDeviceManager.Current.GraphicsDevice;

  // Set XNA/Silverlight Sharing
  graphics.SetSharingMode(true);

  // Create a new SpriteBatch, which can be used to draw textures.
  spriteBatch = new SpriteBatch(graphics);

  // TODO: use this.content to load your game content here

  // Start the timer
  timer.Start();

}

В этом случае используется SetSharingMode, чтобы система поняла, что нужно разделять XNA и Silverlight. GraphicsDevice в SharedGraphicsDeviceManager – это тоже самое, что ты использовал бы как разработчик под XNA, работают все те же операции. Существуют схожие подходы, которые позволяют даже наложить Silverlight поверх XNA игры, используя класс UIElementRenderer.

#8: Служба фоновой передачи

Многим приложениям требуется загружать и скачивать контент. Разработчики могут сделать выбор в пользу создания фоновых агентов для выполнения этой задачи, но, как правило, наилучшим вариантом для передачи файлов является служба фоновой передачи.

Служба создана для того, чтобы позволить ставить в очередь файлы для передачи, которую выполняет операционная система. Ключевым здесь является использование класса BackgroundTransferService для создания запросов.

// Determine the source and destination
var serverUri = new Uri("http://shawntwain.com/anne.mp3");
var isoStoreUri = new Uri("/shared/transfers/anne.mp3"),
                          UriKind.Relative);

// Create the Request
var request = new BackgroundTransferRequest(serverUri, isoStoreUri);

BackgroundTransferService.Add(request);

Служба также может быть использована для загрузки файлов на сервер.

// Determine the source and destination
var serverUri = new Uri("http://shawntwain.com/anne.mp3");
var isoStoreUri = new Uri("/shared/transfers/anne.mp3"),
                          UriKind.Relative);

// Create the Request
var request = new BackgroundTransferRequest(serverUri);

// Set options
request.UploadLocation = isoStoreUri;
request.Method = "POST";

BackgroundTransferService.Add(request);

Служба фоновой передачи накладывает некоторые ограничения на количество запросов на одно приложение, независимо от того, делаются ли эти запросы когда устройство работает от аккумулятора, или скачивания происходят только при отсутствии сотового подключения. Но, даже не смотря на это, BackgroundTransferService является правильным способом передачи данных в Mango.

#7: Локальная база данных

Хотя использование сериализованных объектов в изолированном хранилище Windows Phone применяется чаще всего, бывают случаи, когда хранение данных в локальной базе данных облегчает разработку. Именно с этой целью в Mango реализована поддержка локальной базы данных. Опция построена поверх LINQ to SQL. Поддержка локальной базы данных легко используется в качестве code-first механизма для создания хранилища данных. Например, ты легко можешь выстроить класс и использовать атрибуты для спецификации полей в базе данных. После этого появляется поддержка контекстного класса, который превращает каждую таблицу в конечную точку для запросов LINQ. Класс DataContext возьмет каждое поле, имеющее тип Table, и разрешит эту таблицу в локальной базе данных. Класс DataContext также поддерживает создание базы данных и ограниченный механизм модернизации схемы базы данных. С этим классом ты легко можешь хранить и запрашивать данные.

var  ctx = new MyContext();

// If needed, create the database
if (!_ctx.DatabaseExists())
{
  ctx.CreateDatabase();
}

var game = new Game()
{
  Name = "Gears of War",
  Price = 59.99,
  ReleaseDate = DateTime.Now
};

ctx.Games.InsertOnSubmit(game);
ctx.SubmitChanges();

var qry = from g in ctx.Games
          where g.Price > 50
          select g;

var results = qry.ToList();

Если коротко, то локальная база данных в Mango представляет собой простой, но мощный способ управления реляционной БД на устройстве.

#6: Производительность загрузки изображений

У Windows Phone 7 было несколько проблем с производительностью пользовательского интерфейса, от которых Microsoft хотела избавиться, не ломая старый код. Одна из проблем заключалась в том, что изображения загружались в потоке пользовательского интерфейса, что приводило к ухудшению отклика UI при большом количестве изображений (в ListBox DataTemplate). Для решения этой проблемы в Mango была реализована поддержка четырех опций:

  • None: Изображения моментально загружаются в поток пользовательского интерфейса.
  • DelayCreation: изображения загружаются в фоновый поток (вне потока UI).
  • IgnoreImageCache: изображения всегда загружаются через универсальный идентификатор ресурсов (URI).
  • BackgroundCreation: изображения декодируются в фоновом потоке (вне потока UI).

Эти опции находятся в перечне CreateOptions и помечены побитовыми флажками, чтобы их можно было объединять. В Mango по умолчанию используется BackgroundCreation, но во многих случаях у тебя может появиться необходимость отложить создание, как показано в этом примере:

<Image>
<Image.Source>
<BitmapImage CreateOptions="BackgroundCreation,DelayCreation" UriSource="http://shawntwain.com/st_eyesh.jpg" />
</Image.Source>
</Image>

Существует возможность спецификации посредством объекта BitmapImage в XAML свойств исходного изображения. Флажки можно комбинировать, используя запятую, как показано в примере.

#5: Производительность скроллинга

Скроллинг значительно улучшен в Windows Phone 7.5. Вместо контроля скроллинга, который использовался в Windows Phone 7, Mango позволяет операционной системе управлять скроллингом по умолчанию. Это значит, что свойства элементов на участке скроллинга ограничены, когда пользователь прокручивает элементы. Как результат – более простой способ управления скроллингом. Если тебе нужно регулировать скроллинг на программном уровне, ты можешь выбрать способ управления скроллингом, используя свойство в классе ScrollViewer:

<ListBox x:Name="theList" ScrollViewer.ManipulationMode="Control" />

Этот метод стоит использовать лишь в том случае, если есть необходимость вернуться к модели, которая применялась до появления Mango, так как ManipulationMode является системой по умолчанию.

#4: Улучшенные тайлы

Живые тайлы получили несколько значительных улучшений. Вот несколько самых важных из них:

  • Теперь живые тайлы поддерживают обновление тайлов внутри приложения посредством нового простого API.
  • У живых тайлов теперь есть обратная сторона, которая иногда демонстрируется и может содержать дополнительную информацию.
  • Теперь ты можешь иметь более одного живого тайла (вторичные тайлы).

Класс ShellTile поддерживает управление живыми тайлами, включая повторение и создание новых. Например, ты можешь взять главный живой тайл и модифицировать его.

var tileData = new StandardTileData()
{
  Title = "My App",
  BackgroundImage = new Uri("background.png", UriKind.Relative),
  Count = 42,
  BackContent = "This is the back",
  BackTitle = "The Back",
  BackBackgroundImage = new Uri("http://foo.com/moonimage.jpg")
};

var myTile = ShellTile.ActiveTiles.FirstOrDefault();

// Update the tile
if (myTile != null)
{
  myTile.Update(tileData);
}

Тут же можно видеть, что класс StandardTileData используется для спецификации как лицевой, так и оборотной стороны живого тайла. Получив первый живой тайл через свойство ActiveTiles класса ShellTile, ты можешь изменять его с помощью функции Update. Также можно создавать вторичные тайлы, используя метод Create класса ShellTile с тем же самым классом StandardTileData:

ShellTile.Create(new Uri(uri, UriKind.Relative), tileData);

Важная черта метода Create заключается в том, что он использует относительный URI. Все вторичные тайлы будут использоваться в приложении как ссылки внутри приложения. Представь, к примеру, что ты создаешь погодное приложение. Оно могло бы создавать вторичные тайлы для каждого города, о котором пользователь хочет получить информацию.

#3: Доступ к оборудованию камеры

Одной из самых главных проблем в определенных типах приложений до появления Mango было отсутствие доступа к камере в реальном времени. Можно было попросить телефон сделать фотографию и вернуть ее тебе, но прямой доступ к камере в реальном времени был невозможен. В Mango эта проблема была решена за счет добавления двух опций:

  • API Webcam в Silverlight 4;
  • класс PhotoCamera.

Класс PhotoCamera – это простая обертка для камеры, которая позволяет приложению делать свои собственные фотографии.

var cam = new Microsoft.Devices.PhotoCamera();

// Fires when the capture is done, but the image isn't ready yet
cam.CaptureCompleted += cam_CaptureCompleted;

// So you need to wait for image to be ready too
cam.CaptureImageAvailable += cam_CaptureImageAvailable;

// Camera can be used as a VideoBrush so you can show the camera in the UI
viewfinderBrush.SetSource(cam);

Класс PhotoCamera поддерживает события для создания снимков и использования камеры как VideoBrush, что позволяет выводить видоискатель. Этот метод заключает в себя весь опыт создания снимков, избавляя от нужды переключаться в приложение камеры на телефоне. Вдобавок к этому, для полноты опыта ты можешь использовать кнопку камеры. Таким образом, можно управлять созданием фотографий из приложения, или использовать API Webcam в Silverlight 4 для поддержки доступа к видеокадрам с камеры в реальном времени, если тебе понадобится моментальная обработка потока.

#2: Быстрое переключение между задачами

Хотя процесс деактивации приложения, которое пользователь использует для навигации, дарит ему благоприятный опыт ухода и возвращения к приложению, до появления Mango предполагалось, что это может заставить процессы выключаться сильнее, чем нужно. Чтобы исправить эту проблему, в Mango реализована поддержка быстрого переключения между задачами. Это значит, что теперь приложение не выключится, если пользователь прервет его работу. Операционной системе позволено поставить процесс на паузу, а если пользователь решит вернуться к нему, приложение просто возобновит работу.

Для этого событие Activated в классе Application включает информацию о сохраненном процессе.

private void Application_Activated(object sender, ActivatedEventArgs e)
{
  if (e.IsApplicationInstancePreserved == false)
  {
    // Load data from the Phone's State
    _myData = PhoneApplicationService.Current.State["myData"] as MainViewModel;
  }
}

#1: Многозадачность

Наконец мы дошли до главной функции, которой большинству разработчиков не хватало в Windows Phone до появления Mango. Это возможность запускать код в фоновом режиме. Теперь это можно делать с помощью фоновых агентов. Существует четыре вида таких агентов:

  • Периодические агенты – код, который запускается примерно каждые 30 минут и производит короткую обработку.
  • Ресурсоемкие агенты – код, который запускается, когда устройство заряжается и соединяется не с помощью сотового подключения (например Wi-Fi). Этот код выполняет более длительную обработку.
  • Агенты аудио – код, который взаимодействует с музыкальным плеером, чтобы определять, какая музыка играет, переходить на следующий/предыдущий трек в плейлисте и т.д.
  • Агенты потокового аудио – код, который активно передает потоковое аудио на устройство (и декодирует его) для приложений, которым требуется ручное управление цифровыми правами (DRM) и аутентификацией.

Хотя эти опции не решают все проблемы фоновых задач, они нацелены на защиту пользователя от приложений, которые плохо себя ведут. Эти агенты находятся в отдельном проекте, который поставляется в виде отдельной сборки как часть приложения. Отдельная сборка используется для того, чтобы минимизировать загрузку памяти фоновыми задачами.

У каждого из этих агентов есть специфический критерий, который определяет, когда и как они должны работать. Возьмем простой пример периодической задачи. Когда ты добавляешь проект периодического агента, новый проект, содержащий один единственный класс ScheduledTaskAgent, добавляется к решению. Этот класс используется для запуска кода.

public class TaskScheduler : ScheduledTaskAgent
{
  protected override void OnInvoke(ScheduledTask task)
  {
    UpdateTile();
    NotifyComplete();
  }
}

Как ты видишь, был вызван метод OnInvoke, который предоставляет информацию о задаче, и ты можешь запускать в фоновом режиме тот код, который тебе нужен. Когда обработка завершена, вызов NotifyComplete дает операционной системе понять, что фоновая задача успешно выполнена. Перед использованием этого метода тебе придется зарегистрировать свой периодический агент.

В следующем видно, что необходимо создать объект PeriodicTask, который содержит метаданные о задаче. Периодической задаче не нужно знать о классе твоего агента, так как приложение может иметь лишь одного из них, и он автоматически соединяется с файлом WMAppManifest.xml.

var taskName = "MyPeriodicTask";

var task = new PeriodicTask(taskName)
{
  Description = "My Task does nothing...yet."
};

if (ScheduledActionService.Find(taskName) == null)
{
  // New Task
  ScheduledActionService.Add(task);
}
else
{
  // Replace old Task
  ScheduledActionService.Replace(task);
}

Перед добавлением новой задачи нужно проверить, существует ли она. Если нет, можно вызвать метод Add класса ScheduledActionService; также можно вызвать метод Replace для перерегистрации агента. Агенты нужно регистрировать каждые две недели, но стандартной практикой является перерегистрация агентов при каждом запуске приложения.

Еще больше интересных функций Mango

Будь ты новичок или бывалый разработчик под Windows Phone, этот список поможет тебе познакомиться со многими улучшениями и новыми функциями Windows Phone 7.5. Функции, о которых я рассказал – это всего лишь мой личный ТОП-10. Ты, несомненно, найдешь своих собственных фаворитов по мере знакомства с Mango и разработки проектов под Windows Phones.

Шон Вайлдермаф, Microsoft MVP (C#), MCSD.NET, MCT и основатель Wildermuth Consulting Services.

 
программирование
Windows Phone
лучшее
статья
0 0 0

Чтобы оставлять комментарии вам необходимо зарегистрироваться