Статьи

Представляем Windows 8 для разработчиков Android — часть 1

Вступление

Эта серия из двух частей ( часть 1  и  часть 2 ) предназначена для разработчиков Android, которые ищут возможности для создания приложений для Магазина Windows. Чтобы облегчить адаптацию разработчика Android на платформе Windows 8, мы будем использовать фундаментальный подход к изложению задач мобильной разработки и покажем, как их выполнять в Windows 8. Задачи включают настройку среды разработки, пользовательского интерфейса дизайн, обработка событий виджетов, локальное хранилище, интеграция с внешними системами и уведомлениями устройств. Учитывая сходство между двумя платформами в мобильном пространстве, разработчики Android будут чувствовать себя как дома при разработке приложений для Магазина Windows.

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

Большая часть обсуждений Windows 8 в этой серии посвящена модели программирования XAML и C #. Однако это одна из многих моделей программирования, поддерживаемых в Windows 8; другие включают HTML5 / Javascript, VB.NET, C ++ и DirectX.

Платформа

Windows 8 доступна на различных типах устройств, включая настольные компьютеры, планшеты и еще не созданные устройства различных форм-факторов; Тем не менее, наша цель для этой статьи — Windows 8 в контексте планшетов. С минимальными усилиями разработчики Android могут быть дома с Windows 8, так как она имеет много общего с Android с точки зрения архитектуры ОС, концепций мобильной разработки, инструментов для разработчиков и перспективы SDK. На рисунке 1 показаны обе платформы рядом друг с другом, иллюстрирующие компоненты, которые важны для разработчиков.

Android: ядро

Android построен поверх ядра Linux, адаптированного для мобильных устройств; Изменения в ядре включают эффективное управление питанием, повышение безопасности, поддержку нового оборудования, повышение производительности файловой системы флэш-памяти и улучшение отчетов об ошибках. Пользовательские программы на Android размещаются внутри виртуальной машины Java во время выполнения, и, следовательно, разработчики могут воспользоваться преимуществами подмножества Java API, фундаментальных для JDK. Android также обеспечивает привязку Java в пространстве имен Android для программирования на платформе, такого как управление питанием, пользовательский интерфейс, программирование на основе местоположения, локальное хранилище и интеграция в облачные вычисления.

Windows 8: ядро

Усовершенствования в ядре Windows 8 слишком многочисленны, чтобы упоминать, однако, вот некоторые из них: повышение производительности загрузки, включение функций System-on-Chip, улучшение управления питанием устройств во время выполнения, улучшения производительности инфраструктуры драйверов пользовательского режима и безопасность улучшения в структуре драйвера пользовательского режима.

Большинству разработчиков, вероятно, не безразличны тонкие детали архитектуры драйверов, однако стоит отметить, что Windows 8 поддерживает архитектуру драйверов, которая допускает режим пользователя, а также драйверы режима ядра. Драйверы пользовательского режима (например, камера, принтер) работают в среде с низким уровнем привилегий (в пользовательском режиме), что предотвращает сбои системы из-за проблем с качеством драйверов. Обратите внимание, что на диаграмме показаны все драйверы Windows 8, работающие в режиме ядра, просто для демонстрации симметрии между Android и Windows 8. 

fig1- архитектура

Рисунок 1: Архитектура бок о бок

Android: время выполнения

Типичные приложения, созданные разработчиками для Android, запускаются внутри экземпляра виртуальной машины Dalvik, которая представляет собой виртуальную машину Java на основе регистров, оптимизированную для нехватки памяти и устройств с процессорами, дружественными для мобильных устройств. Файлы классов Java преобразуются в исполняемые файлы Dalvik, которые называются файлами DEX. Эти DEX-файлы интерпретируются за исключением случаев, когда среда выполнения может JIT скомпилировать горячую трассировку. Подмножество библиотек Java распространяется как часть Android SDK. Нативно закодированные библиотеки Android доступны для среды программирования Java как привязки к конкретному языку. Эти вызовы Android API из Java будут передаваться нативному коду через JNI, который совершенно непрозрачен для разработчиков.

Windows 8: время выполнения

Эквивалентом Android Runtime в Windows 8 является WinRT, который является «песочницей» для запуска приложений Магазина Windows. Windows 8 поддерживает два типа приложений — настольные приложения и приложения Магазина Windows. Приложения Магазина Windows запускаются в изолированной программной среде безопасности, которая жестко контролирует доступ к системным ресурсам, в то время как традиционные настольные приложения запускаются с привилегиями, неявно унаследованными от пользователя, запустившего приложение. В случае настольных приложений код полностью доверенный, и, следовательно, конечному пользователю не требуются никакие дискреционные разрешения, если только код не был получен из мобильного местоположения, такого как внешний ресурс или Интернет.

WinRT не делает таких предположений относительно приложений Магазина Windows; разрешения на доступ к системным ресурсам (например, сети, файловой системе, местоположению) должны быть явно запрошены приложением во время разработки. Во время выполнения, когда к защищенному ресурсу обращаются, конечный пользователь предоставляет разрешение через диалоговые окна согласия. Другое отличие состоит в том, что настольные приложения могут быть установлены из любого источника, в то время как приложения Магазина Windows, ориентированные на WinRT, могут быть установлены только из надежных источников, таких как Магазин Windows, или локального репозитория в управляемой настройке.

В этом обсуждении мы сосредоточимся только на приложениях Магазина Windows (также называемых приложениями Магазина Windows), поскольку они эквивалентны приложениям Android. Приложения Магазина Windows публикуются в Магазине Windows, который аналогичен Google Play и другим магазинам Android, в которые разработчики должны представить свои приложения для сертификации и последующей публикации.

Windows 8 эквивалентно Android Dalivik VM — это .NET CLR; каждый процесс в приложении Магазина Windows создает экземпляр .NET CLR (Common Language Runtime) для запуска кода приложения, написанного на языках .NET, таких как C # и VB.net. Код .NET развертывается как байтовый код MSIL (Microsoft Intermediate Language), который компилирует JIT в набор команд X86 или ARM во время выполнения. Это похоже на компиляцию исходного кода Java в файлы DEX и интерпретацию файлов DEX во время выполнения в Android.

WinRT позволяет использовать только часть .NET в приложениях Магазина Windows, написанных на языках .NET. Это включает в себя IO, коллекции LINQ, сети, http, сериализацию объектов, многопоточность, WCF (Windows Communications Foundation) и XML. Полный список .NET API для приложений Магазина Windows можно найти по адресу:  .NET для приложений Магазина Windows — поддерживаемые API .

Приложения Магазина Windows, написанные с использованием HTML / Javascript и C ++, будут напрямую вызывать WinRT API для реализации функциональности приложения. WinRT API — это набор COM-компонентов, расположенных поверх Windows Core; Эти компоненты доступны для различных языков, включая C #, VB.NET, C ++ и Javascript, посредством специальных языковых проекций. Проекции — это файлы метаданных, которые будут использоваться Visual Studio IDE и языковым компилятором для замены вызовов API для конкретного языка на вызовы API WinRT.

Библиотеки

WinRT API — это набор нативных компонентов, реализованных в COM (объектная модель компонентов), знакомый большинству программистов Windows. Для разработчиков Android, которые являются новичками в платформе Windows, COM — это технология на основе RPC, которая создает жизненный цикл объекта и управляет им с помощью фабрик классов и подсчета ссылок. Разработчики защищены от сложности COM-части WinRT API посредством языковых проекций.

Подобно Android, WinRT имеет библиотеки для воспроизведения мультимедиа, работы в сети, хранения, географического расположения и других важных компонентов для разработки мобильных приложений. Некоторые библиотеки, показанные для Android, такие как SGL, libc и SSL, имеют свои аналоги в Windows 8 через механизм рендеринга XAML, среду выполнения C и реализацию SSL. Несмотря на то, что SQLite не распространяется как часть WinRT, существуют WinRT-совместимые библиотеки с открытым исходным кодом, которые позволяют разработчикам встраивать функциональность реляционной базы данных без сервера в приложения Windows 8 для Магазина Windows.

Эквивалент WebKit на Android, рендеринг HTML выполняется через Trident IE10, который помогает рендерингу HTML в Windows 8. Обе платформы имеют одноименный класс-WebView для встраивания веб-сайтов в приложения.

Среда разработки

Eclipse с плагином Android, Net Beans и IntelliJ — это несколько сред разработки, которые поддерживают разработку приложений для Android. Эти инструменты поддерживают несколько операционных систем, включая Windows, Mac и различные версии Linux. Для разработки Windows 8 требуется  как минимум операционная система Windows 8 и  Visual Studio 2012 Express для Windows 8 . Visual Studio 2012 поставляется с собственным дизайнером пользовательского интерфейса, похожим на Android-дизайнер в Eclipse. Visual Studio 2012 также поставляется в комплекте с Blend для Visual Studio 2012, который представляет собой инструмент, ориентированный на дизайнера, который позволяет создавать богатые пользовательские интерфейсы с помощью перетаскивания виджетов, анимации и переходов.

Обычно разработка Android ведется на Java (в исключительных случаях — на C / C ++), а Windows 8 поддерживает C ++, C #, VB.NET и Javascript. Декларативный дизайн экрана в Android записывается в XML-файл, который вставляется в соответствующий код Activity во время выполнения. Точно так же декларативный дизайн экрана в Windows 8 записан в XML, который имеет специальное обозначение под названием XAML, что означает расширяемый язык разметки приложений. XAML — это язык декларативной композиции объектов, где каждый узел XML представляет соответствующий объект из WinRT API. Windows 8 использует тот же формат XAML с C #, VB.NET и C ++, в то время как Javascript использует HTML / CSS в качестве декларативного языка оформления экрана. Программирование DirectX на C ++ не использует никакого декларативного интерфейса.

fig2 - Среда разработки

Рисунок 2: Среда разработки

Поскольку ОС Windows 8 является обязательным условием для разработки приложений для Магазина Windows, разработчикам, использующим Windows 7, Linux или Mac в качестве основной ОС, необходимо использовать технологии виртуализации (например, VirtualBox, VMWare или Parallels), чтобы запустить Windows 8 как ВМ или установите Windows 8 в режиме двойной загрузки.

Рисунок 3 - процесс публикации

Рисунок 3: Процесс публикации приложения

На рис. 3 показана последовательность действий, связанных с отправкой приложения на платформах Android и Windows 8. Dev.windows.com  является ведущим сайтом для всех ресурсов по разработке и разработке для Windows 8, включая  инструменты и загрузку SDK , создание вашего первого приложениядокументацию по API и множество  примеров  как от Microsoft, так и от сообщества разработчиков.

Одно из различий между разработкой Android и разработкой Windows 8 заключается в том, что для приложения Магазина Windows требуется лицензия разработчика, которая является бесплатной. Лицензия загружается в Visual Studio 2012 во время первого использования среды IDE и впоследствии всякий раз, когда она истекает, то есть каждые 30 дней. Как только разработчик регистрируется в учетной записи Windows Store, лицензия обновляется каждые 90 дней. Процесс получения лицензии требует от пользователя входа в dev.windows.com с использованием учетной записи Microsoft.

Регистрация в Магазине Windows не требуется при разработке приложения, но требуется во время публикации приложения в магазине. Исключением является использование push-уведомлений, для которых требуется учетная запись Windows Store во время разработки. Для Windows Store требуется годовая подписка, которая стоит 49 долларов США для физических лиц и 99 долларов США для корпоративных аккаунтов. По сравнению с этим регистрация в Google Play стоит всего 25 долларов. Регистрация в Магазине Windows бесплатна для подписчиков MSDN, у которых уже есть права на загрузку программного обеспечения с сайта  msdn.microsoft.com .

См.  Начало работы  на dev.windows.com для настройки среды разработки и создания вашего первого приложения для Магазина Windows.

Концепции пользовательского интерфейса

Дизайн и разработка пользовательского интерфейса имеет много параллелей между приложениями для магазинов Android и Windows 8. Активность — это единица отображения в Android, которая аналогична странице в Windows 8. Активность Android составляет пользовательский интерфейс из глубоко вложенной группы виджетов после применения спецификации макета. Представление является корневым классом для всех виджетов (например, EditText, Button, CheckBox), тогда как ViewGroup является базовым классом для невидимых элементов управления макетом (например, LinearLayout, GridLayout) в Android. View также является корневым классом ViewGroup. Windows 8 здесь немного отличается, так как Control является базовым классом для всех виджетов (например, TextBox, Button, CheckBox), а Panel является базовым классом для невидимых элементов управления макетом (например, StackPanel, GridLayout).Во время выполнения содержимое, содержащееся в объекте Page, прикрепляется к объекту Windows, прежде чем оно сможет отображаться и быть готовым для получения потоков событий.

Рисунок 4 - Элементы пользовательского интерфейса

Рисунок 4: Элементы пользовательского интерфейса

Вот несколько атрибутов приложений Android и Windows Store в контексте единицы отображения:

Android

Windows 8

Приложение представляет собой набор мероприятий

Приложение представляет собой коллекцию страниц

Активность — это единица отображения, видимая конечному пользователю.

Страница — это единица отображения, видимая конечному пользователю.

Каждое действие предназначено для выполнения функции (например, отправка почты, фотографирование, выбор контакта)

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

Активность состоит из набора элементов управления макета и виджетов (например, Button, EditText, CheckBox)

Страница состоит из набора элементов управления макета и виджетов (например, Button, TextBox, CheckBox)

Только один вид деятельности может быть виден конечному пользователю одновременно

Только одна страница может быть видна конечному пользователю за раз

Действия складываются в заднем стеке LIFO в контексте Задачи по мере их возникновения. Кнопка «Назад» или завершение «Деятельности» вызовет действие, уничтожающее его в процессе. Определенные для приложения задачи могут быть созданы, если семантика навигации должна содержаться в приложении.

Страницы размещаются в стеке навигации в данном приложении. Нет концепции общесистемного стека навигации. Обмен информацией между приложениями осуществляется через контракты. При вызове контракта (например, Поиск) отображается целевое приложение, и после завершения обработки в целевом приложении элемент управления вернется к приложению, которое инициировало сообщение о контракте. В приложении пользователи могут перемещаться между страницами с помощью семантики кнопки «назад».

Модуль отображения на обеих платформах использует подключенную пару декларативного компонента для пользовательского интерфейса и обязательного компонента для обработки событий и логики обработки. Для каждого действия Android декларативная часть пользовательского интерфейса записывается в файл макета XML, а обязательный компонент кодируется в соответствующий файл Java.

Для каждой страницы в разработке Windows 8 декларативный компонент записывается в файл XML с расширением .XAML, а императивный компонент кодируется в соответствующий файл кода C # (или VB.NET, C ++). Исключением является приложение Windows Store на основе Javascript, в котором декларативный пользовательский интерфейс записан в HTML-файл, а обязательный компонент закодирован в соответствующий файл Javascrtipt. Обе платформы объединяют декларативный и императивный компоненты на ранних этапах компиляции перед созданием библиотек классов java или .NET.

В Android обработка событий осуществляется через интерфейсы наблюдателя, в то время как приложения Магазина Windows используют делегаты .NET, которые аналогичны указателям на функции C, но программируются только проще. Разработка под Android и Windows 8 скрывает сложность привязки логики обработчика к событиям виджета, позволяя спецификации декларативно указать имя обработчика в файле XML.

Обе платформы позволяют разрабатывать составные части пользовательского интерфейса, которые можно повторно использовать в нескольких единицах дисплея. Разработчики Android обычно создают составные компоненты и фрагменты, в то время как разработчики Windows 8 создают элементы управления UserControls, у которых Control является родительским классом в иерархии наследования. Концепция управления Windows основана на традиционной парадигме разработки Windows и очень популярна среди поставщиков средств управления для расширения платформы разработки Windows 8.

UI Navigation

В Android разработчики отображают действия и переключаются между действиями, содержащимися в одном приложении или в нескольких приложениях. Когда конечный пользователь перемещается от одного действия к другому, действия помещаются в стек, который можно развернуть с помощью мягкой или жесткой кнопки «назад», обычно расположенной на нижней панели задач, или через завершение действия в приложении. Как только действие завершает свою работу, действие удаляется из стека, и действие под завершенным действием выходит на первый план. Android использует явное намерение для вызова действий в одном приложении, тогда как неявное намерение помогает в вызове действий, находящихся в другом приложении или системных действиях.

Внутренняя навигация приложений в Windows 8 аналогична явному механизму Intent в Android. В Windows 8 разработчики отображают страницы и перемещаются между страницами в пределах одного и того же приложения с помощью стека навигации для конкретного приложения. В Windows 8 нет стека страниц системного уровня и нет кнопки «назад» на системном уровне, чтобы развернуть стек.

figure5 - экранная навигация

Рисунок 5: Экранная навигация

На рисунке 5 показана типичная схема навигации для рабочего процесса приложения, который последовательно перемещается по двум действиям в App1 и третьему действию в App2 и возвращается к действию 1 приложения через действие 2. В Android навигация внутри приложения осуществляется через явные намерения, как показано ниже:

//Android: Java – display second activity
public class Activity1 extends: Activity {
  //code left for brevity
  void startActivity2() {
    Intent activity2 = new Intent(this, Activity2.class);
    startActivity(activity2);
  }
}

Когда вышеуказанный код выполняется, Android останавливает Activity1 и отображает Activity2 после автоматического добавления Activity2 в задний стек. Состояние пользовательского интерфейса, включая контекст в полях экрана, сохраняется, но больше не на переднем плане, и действие прекращается.

Аналогично в Windows 8, внутренняя навигация приложения в XAML включается свойством Page.Frame, которое устанавливается, когда фрейм загружает страницу перед ее отображением для отображения. Метод Frame.Navigate () активирует новую страницу и добавляет ее в стек навигации. Объект Frame также поддерживает методы GoBack () и GoForward () для навигации по стеку страниц. Поведение Frame.Navigate () по умолчанию — каждый раз создавать новый экземпляр. Тем не менее, это поведение может быть переопределено путем кэширования страниц с помощью параметра Page.NavigationCacheMode «включен». Следующий код показывает активацию Page2 внутри Page1.

//Windows 8: C# - display Page2
public partial class Page1: Page
{
   //code left for brevity
   void StartPage2()
   {
       this.Frame.Navigate(typeof(Page2));
   }
}

В Android навигация между приложениями достигается посредством явного Интента, который будет транслироваться операционной системой всем приложениям, которые могут реагировать на тип полученного намерения.

В Windows 8 обмен информацией между приложениями осуществляется через  контракты и расширения . Контракт предназначен для четко определенного взаимодействия между двумя или более приложениями, а расширение предназначено для расширения возможностей операционной системы посредством четко определенного соглашения. Контракт концептуально похож на явное намерение в платформе Android. Примеры контрактов Windows 8 включают FileOpenPicker, Search и Share. В число расширений входят «Настройки камеры» (позволяет определить пользовательский интерфейс пользователя при подключении камеры производителя), «Автозапуск» (система отображает все приложения, которые объявляют «Автозапуск» в качестве поддерживаемого расширения) и «Настройки задачи печати» (приложение может отображать параметры принтера, относящиеся к конкретная марка и модель, когда принтер подключен).

Подобно фильтрам намерений Android, контакты и расширения указаны в файле Package.appxmanifest проекта Visual Studio 2012. При касании чудо-кнопки «Поделиться» или при совместном использовании программного обмена система перечисляет все приложения, которые заявили о себе как «Share Target», в соответствующих манифестах приложений. Конечный пользователь выберет правильное приложение, прежде чем продолжить. Приложение Windows 8 заявляет о своем намерении поделиться, реализуя обработчик DataTransferManager.DataRequested, который будет проверяться системой при вызове чудо-ресурса общего ресурса. Этот обработчик отвечает за упаковку данных, которые будут доставлены в целевой ресурс системой.

В приложении 1, показанном на рисунке 5, реализован обработчик DataRequested, который упакует данные и отправит их в приложение App2, которое объявило себя в качестве «общего ресурса» в манифесте. В следующем фрагменте кода показан обработчик событий DataTransferManager.DataRequested, реализованный в App1:

//App1.Page2: shares text with other apps
public sealed partial class Page2 : Page
{
  public Page2()
  {
  this.InitializeComponent();
   RegisterForSharing();
  }
  private void RegisterForSharing()
  {
    DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
       dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager,
                                         DataRequestedEventArgs>(this.DataRequested);
  }
 
  private void DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
  {
   DataRequest request = e.Request;
   request.Data.Properties.Title = "Sharing text from App1";
   request.Data.Properties.Description = "Demo of Sharing contract";
  request.Data.SetText(textBox.Text);
  }
}

Когда пользователь выбирает App2 из списка отображаемых целей общего ресурса, система вызывает метод OnShareTargetActivation класса Application. Каждое приложение Windows 8 создает «Приложение» как дочерний класс Приложения для начальной загрузки приложения и отображения первой страницы. Приложение общего назначения переопределит и предоставит пользовательскую реализацию для метода Application.OnShareTargetActivation, который отвечает за извлечение данных и передачу управления странице приложения. В приведенном ниже фрагменте кода App2 активирует Page3 после извлечения общих данных, полученных из App1:

//App2: App class overrides OnShareTargetActivated to display the sharing page
 
sealed partial class App2 : Application
{
  //code omitted for brevity
  protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
  {
    Page3 shareTargetPage = new Page3();
    shareTargetPage.Activate(args);
  }
}
 
//App2.Page3 receives shared text
public sealed partial class Page3 : Page
{
  ShareOperation _shareOperation;
  string _data;
 
  public Page3()
  {
    this.InitializeComponent();
  }
  public async void Activate(ShareTargetActivatedEventArgs args)
  {
    this._shareOperation = args.ShareOperation;
    this._data = await this._shareOperation.Data.GetTextAsync();
    Window.Current.Content = this;
    Window.Current.Activate();
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
      this.tbShareResult.Text = this._data;
    });
   }
}

Как только приложение App2 выполнит обработку совместно используемых данных, оно может легко закрыть страницу Page3, вызвав метод this._shareOperation.ReportCompleted () в обработчике кнопок или любом подходящем обработчике виджетов, возвращающем элемент управления обратно на страницу 2 приложения App1. Как показано на рисунке 5, после того, как Page2 завершит свою работу, он может отклониться, чтобы вернуть контроль над Page1.

Виджет / Карта управления

Платформы Android и Windows 8 поддерживают похожие виджеты в модели программирования. Виджеты включают в себя функциональность для размещения и отображения текста, редактирования текста, списков, отображения изображений, переключателей и флажков. Виджеты также включают невизуальные элементы для разметки контента в вертикальных и горизонтальных стеках, сетках и других пользовательских элементах управления разметкой. На рисунке 6 показано подмножество списка виджетов с обеих платформ:

Рисунок 6 - Карта виджетов

Рисунок 6: Карта виджетов

Обработка событий

Обработчики событий связывают декларативную и императивную части приложения в работающее приложение. Модели программирования Android и Windows 8 поддерживают обработчики событий одинаковым образом с небольшими различиями в способе доступа обработчиков к состоянию виджета. Проекты Android в Eclipse позволяют задавать параметры обработчиков в пользовательском интерфейсе XML, как показано ниже:

<!-- activity_main.xml -  XML layout with only important attributes --!>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    tools:context=".MainActivity" >
   <TextView android:id="@+id/textView1" android:text="@string/hello_world" />
   <Button android:id="@+id/btnClickMe" android:onClick="btnClickMe_OnClick"/>
</RelativeLayout>

Изменения состояния виджетов могут быть выполнены внутри кода Java путем явного получения ссылок на виджеты путем вызова метода Activity.findViewById (), как показано в коде ниже:

//MainActivity.java - event handling in Android
public class MainActivity extends Activity {
 private TextView txtView;
 private Button btnClickMe;
 public void btnClickMe_onClick(View v) {
    txtView.setText(“The button was clicked!");
};
@Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   //acquire explicit references to widgets
   btnClickMe = (Button)findViewById(R.id.btnClickMe);
   txtView =(TextView)v.findViewById(R.id.txtView1);
}  
 //code not relevant to event handling is removed for brevity
}

Visual Studio 2012 автоматически создает ссылки на именованные виджеты в файлах с выделенным кодом, чтобы обработчики событий и логика обработки могли напрямую ссылаться на виджеты в формате this. <Widget_name> (например, this.btnClickMe), как показано в следующем код:

<!-- MainPage.xaml without all the attributes --!>
<Page x:Class="ShareFrom.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="using:ShareFrom">
 
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <TextBox x:Name="tbShare" Text="Sharing Text" />
        <Button x:Name="btShare" Content="Share Now" Click="btnClickMe_Click"/>
    </Grid>
</Page>
 
//MainPage.xaml.cs – with only event handler shown
public sealed partial class MainPage : Page {
   private void btnClickMe_Click(object sender, RoutedEventArgs e){
      textBlock.Text = "The button was clicked!";
   }
   //code not relevant to event handling is removed for brevity
}

Макет экрана

Подобно дизайнеру экрана Android в Eclipse, Visual Studio 2012 имеет встроенный конструктор экрана, который позволяет размещать виджеты в различных шаблонах посредством использования соответствующих панелей макета в зависимости от потребностей дисплея приложения. Для продвинутых дизайнов экрана, требующих анимации на временной шкале, переходов экрана и сложных цветовых схем и форм, дизайнеры и разработчики могут использовать Blend для Visual Studio 2012.

Blend и Visual Studio используют один и тот же формат проекта, поэтому любые изменения в файлах проекта будут отражаться в обоих инструментах. Blend предлагает опыт, ориентированный на дизайнера, а дизайнер экрана Visual Studio — на опыт разработчика. Как упомянуто ранее, инструмент Blend включен в биты Visual Studio 2102 и автоматически устанавливается на компьютер разработчика.

На рисунке 8 показан текст Android XML для экрана, показанного на рисунке 7, а аналогичный дизайн экрана XAML для Windows 8 показан на рисунке 9. Как видно, семантика разметки более или менее одинакова с нюансами, которые перечислены здесь:

  • Код Android Activity Java зависит от содержимого XML, в то время как в Windows файл разметки зависит от обязательного компонента, закодированного в C #, Javascript, VB.NET или C ++.
  • Каждый виджет в разработке Android идентифицируется уникальным целым числом, которое используется при получении ссылки на виджет в императивном коде. Имена, данные каждому виджету, следуют уникальному формату, который подсказывает генератору кода поместить сгенерированный целочисленный литерал в определенный статический класс. Например, EditText имеет значение id «@ + id / name», которое указывает на создание нового уникального целого числа с «name» в качестве имени целого числа и помещает его в статический класс с именем «id». В программах это можно получить с помощью R.id.name, чтобы получить ссылки на объект EditText, расположенный в дереве объектов. Эта схема по умолчанию требует, чтобы все действия совместно использовали одно и то же пространство имен виджетов, что требует уникальных имен для всех виджетов. Это может быть преодолено путем тщательного выбора пространства имен виджета, чтобы отразить имя действия, к которому принадлежит виджет.В Visual Studio по умолчанию каждая страница имеет уникальное пространство имен, и, следовательно, имена виджетов должны быть уникальными только на каждой странице.

Рисунок 7 - Contoso

Рисунок 7: Пример экрана ввода мобильных данных

Рисунок 8 - дизайн экрана AndroidРисунок 8: Дизайн экрана Android в XML

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

Рисунок 9 - Дизайн экрана Windows в XAML

Рисунок 9: Дизайн экрана Windows 8 в XAML

Место хранения

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

Настройки приложения

Приложения, как правило, требуют некоторой формы параметров конфигурации, которые определяют внешний вид и поведение приложения. Примеры параметров конфигурации включают имя файла данных или URL-адрес внешней службы, к которой приложение должно получить доступ. Настройки приложения являются индивидуальными для каждого приложения и будут вписываться в режим хранения «имя-значение», поддерживаемый как Android, так и Windows 8. Android называет частное хранилище приложения внутренним хранилищем, чтобы отличать его от внешнего хранилища, чтобы обозначить места хранения, которые могут быть доступным для нескольких приложений.

Android: хранилище настроек приложения

В следующем фрагменте кода показано хранение пары имя-значение в файле Settings.txt во Внутреннем хранилище:

//Android: name-value storage through SharedPreferences
SharedPreferences _appSettings = this.getSharedPreferences(“Settings.txt”, 0);
SharedPreferences.Editor editor = _appSettings.edit();
editor.putString(“datafilename”, “testdata.txt”);
editor.commit();

Windows 8: хранилище настроек приложения

API-интерфейс Windows 8 для хранения приложений инкапсулируется в класс Windows.Storage.ApplicationData, который включает в себя не только хранилище пар имя-значение, но и управление файлами конкретного приложения через объекты WinRT LocalSettings и LocalFolder соответственно. В дополнение к локальному частному хранилищу приложения Windows 8 предлагает аналогичные классы для управления удаленным хранилищем приложения, если конечный пользователь входит в систему с использованием учетной записи Microsoft. Обратите внимание, что LocalSettings также позволяет хранить составные данные в дополнение к примитивам имя-значение. Ниже приведен фрагмент кода для LocalSettings:

ApplicationDataContainer lc = ApplicationData.Current.LocalSettings;
lc["datafilename"] = "tesdata.txt";
ApplicationDataCompositeValue adcv = new ApplicationDataCompositeValue();
adcv["name"] = "John";
adcv["location"] = "Chicago";
lc.Values["userattributes"] = adcv;

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

Файлы приложений

Приложения хранят личные файлы данных, которые загружаются вместе с приложением или постепенно обновляются в ходе использования приложения. Эти файлы включают базы данных SQLite, файлы XML, изображения для конкретных приложений, звуковые файлы и тому подобное. И Android, и Windows 8 имеют API-интерфейсы для ввода-вывода файлов в частное хранилище.

Android: хранилище файлов приложения

В следующем фрагменте кода показано хранение testdata.txt в личном каталоге приложения:

//Android: creates testdata.txt file in the application directory
String data = "<data>...</data";
FileOutputStream stream = openFileOutput("testdata.txt", Context.MODE_PRIVATE);
stream.write(data.getBytes());
stream.close();

При необходимости каталоги можно создавать с помощью API-интерфейсов Activity.getDir () и File.createNewFile () в Android.

Windows 8: хранилище файлов приложений

Все вызовы ввода-вывода WinRT являются асинхронными и требуют использования ключевого слова «await» для приложений Магазина Windows, запрограммированных на языках .NET. Асинхронные вызовы WinRT API возвращают универсальный Task, который, когда ожидается, приостанавливает выполнение метода и возвращает управление вызывающей стороне. Это дает преимущества асинхронного программирования, декларативно избегая сложности обработчиков обратного вызова и кода базовой платы, который нужно написать для передачи состояния из обработчиков в основную логику обработки.

StorageFolder lf = ApplicationData.Current.LocalFolder;
String data = "<data>...</data";
StorageFile dataFile =
     await lf.CreateFileAsync("testdata.txt", CreateCollisionOption.ReplaceExisting);
if (dataFile!=null)
     await FileIO.WriteTextAsync(dataFile, data);

В Windows 8 папка «Загрузки» пользователя разделена для каждого приложения по семейству пакетов (указанному в манифесте приложения), в то время как в Android папка «Загрузки» является широко известной папкой, которая может быть прочитана или записана всеми приложениями с одним разрешением WRITE_EXTERNAL_STORAGE. ,

Ниже приведен фрагмент кода для доступа к папке загрузок в приложении Магазина Windows:

StorageFile dataFile =
     await Windows.Storage.DownloadsFolder.CreateFileAsync("dataFile.txt");
   await FileIO.WriteTextAsync(dataFile, "sample data");
 

Внешний каталог File IO

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

Android: внешнее хранилище

Внешнее хранилище для загрузок, видео, музыки и изображений можно получить из вызова Activity.getExternalFilesDir (), предоставив соответствующую строковую константу в качестве аргумента из класса android.os.Enviroment. Например, getExternalFilesDir (Environment.DIRECTORY_PICTURES) позволяет получить ссылку на каталог с картинками и работать с файлами с помощью java.io. На момент написания этой статьи все каталоги во внешнем хранилище были доступны всем приложениям для чтения и записи, если в манифесте приложения указано разрешение WRITE_EXTERNAL_STORAGE.

Вот пример того, как файл может быть создан в каталоге внешнего хранилища:

  String data = "<data>...</data“;
  String dir = getExternalFilesDir(null);
  File dataFile = new File(dir,"datafile.txt“);
  OutputStream stream = new FileOutputStream(dataFile);
  stream.write(data.getBytes());
  stream.close();

Вот фрагмент кода Android для доступа к каталогу изображений:

String dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File photo = new File(dir, “SeattleSkyLine.png”);
//do file I/O using java.io package

Windows 8: внешнее хранилище

Windows 8 позволяет приложениям выполнять файловый ввод / вывод из хорошо известных папок: библиотеки документов, библиотеки музыки, библиотеки изображений и библиотеки видео. Приложения должны объявить потребности в доступе к папкам в манифесте для каждой из этих известных папок через узел <abilities /> с одной записью <ability /> для каждой из папок. Приложения Магазина Windows могут получить доступ только к закрытым каталогам, которые обсуждались ранее, и к этим известным папкам на устройстве. Все известные папки доступны через объект Windows.Storage.KnownFolders, который является неотъемлемой частью WinRT API. Windows 8 обеспечивает детальный доступ к этим известным папкам по сравнению с единым разрешением для доступа к внешнему хранилищу в Android. Также,все известные папки в Windows 8 зависят от пользователя, в то время как в Android отсутствует понятие текущего пользователя, и, следовательно, все известные папки являются общими для всей системы.

В следующем фрагменте кода показано создание документа в папке «Документы» пользователя:

//DocumentLibrary
 StorageFolder storageFolder = Windows.Storage.KnownFolders.DocumentsLibrary;
 StorageFile file = await storageFolder.CreateFileAsync("testdata.txt",
                                            CreationCollisionOption.ReplaceExisting);
 await FileIO.WriteTextAsync(file, "test data");

Приведенный выше код будет работать только в том случае, если в манифесте приложения указана возможность «Библиотека документов» и «.txt» в качестве разрешенного типа файла. Вот фрагмент манифеста, который показывает вышеприведенные определения:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe"
                                EntryPoint="StorageDemo.App">
      <Extensions>
        <Extension Category="windows.fileTypeAssociation">
          <FileTypeAssociation Name="textfile">
            <SupportedFileTypes>
              <FileType>.txt</FileType>
            </SupportedFileTypes>
          </FileTypeAssociation>
        </Extension>
      </Extensions>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="documentsLibrary" />
  </Capabilities>
</Package>

Если вместо текстового редактора XML используется редактор Visual Studio, разработчику необходимо использовать вкладку «Возможности» для указания возможности «Библиотека документов» и вкладку «Объявления» для настройки FileTypeAssociation.

WinRT содержит API-интерфейсы для загрузки и выгрузки больших объемов данных во внешнее хранилище в пространстве имен Windows.Networking.BackgroundTransfer. BackgroundDownloader и BackgroundUploader — это пара классов среди многих, которые предназначены для передачи по сети больших файлов (например, видео, фотографий) через Интернет. Эти объекты выполняются как фоновые задачи, которые система может приостановить и перезапустить по мере необходимости для выполнения задачи загрузки или выгрузки.

В следующем фрагменте кода показано использование Windows.Networking.BackgroundTransfer.BackgroundDownloader для загрузки файла изображения из Интернета.

//image download example
StorageFile faviconFile;
try {
  faviconFile = await KnownFolders.PicturesLibrary.CreateFileAsync(
                    "bing.ico", CreationCollisionOption.GenerateUniqueName);
}
catch {}
 
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation downloadOp =
    downloader.CreateDownload(new Uri(@"http://bing.com/favicon.ico"), faviconFile);
 
await downloadOp.StartAsync();

Чтобы вышеуказанный код работал, в манифесте приложения должны быть указаны возможности «Интернет-клиент» и «Библиотека изображений», как показано ниже:

Capability Name="internetClient" />
<Capability Name="picturesLibary" />

Другие известные папки, такие как «Музыкальная библиотека» и «Библиотека видео», следуют аналогичным схемам доступа.

Вывод

Both Android and Windows 8 platforms offer similar fundamental capabilities, development tools and SDKs to accomplish the necessary programming tasks for publishing the applications to the respective stores. In part 1 of this series, we have covered a few fundamental aspects of Android and Windows 8 platforms that includes the system architecture, UI concepts, widget maps, navigation and contracts and application storage and external storage. In part 2, we will cover networking, web services, integrating with cloud services and push notifications. Given the similarities between both the platforms, Android developers will feel right at home with Windows 8 development. Information for getting started on Windows 8 development can be obtained from http://dev.windows.com.