Блог Сергея Байдачного

Мой блог о технологиях

Archive for Ноябрь 2012

Регистрация на WIndows Phone 8 Camp подходит к концу

6 комментариев

Если кто-то еще думает, нужно ли приходить на Windows Phone 8 Camp, то решайте быстрее. 120 человек уже зарегистрировалось и осталось всего 20 мест.

В ходе события сделаем демо-стенд новых устройств Nokia:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032537231&Culture=UK-UA&community=0

Written by Sergiy Baydachnyy

28.11.2012 at 09:32

Опубликовано в Windows Phone

Tagged with

Компиляция приложения в облаке

3 комментария

 

На конференциях по Windows Phone регулярно задают вопросы о том, как ведут себя приложения после установки на устройство. Дело в том, что если говорить о Silverlight приложениях, то они поставляются в виде xap пакета, который содержит промежуточный код, понятный только управляемой платформе .NET Framework. После установки приложения, оно проходит компиляцию на конкретном устройстве и кэшируется для того, чтобы в следующий раз система смогла запустить уже готовую откомпилированную версию. Утилита, которая позволяет провести предварительную компиляцию кода, называется Native Image Generator (NGEN) и является стандартной для .NET Framework на любой платформе. Таким образом, производительность при запуске Silverlight приложений никак не затрудняется платформой, исключая только первый запуск. Тут вызывается NGEN, что может существенно увеличить время ожидания пользователя и оказать влияние на мнение пользователя о приложении.

Чтобы исключить проблему компиляции при первом запуске, Windows Phone 8 получает уже откомпилированное приложение. Разработчик, как и раньше, загружает в Windows Phone Store свой пакет, а Store обеспечивает компиляцию этого пакета в облаке. Для десктоп систем предварительную компиляцию в общем случае было реализовать невозможно, так как уж очень разное оборудование у пользователей, а .NET Framework компилирует приложения, оптимизируя их под конкретное устройство. Но ведь телефоны, как бы это цинично не звучало, все одинаковые. Точнее имеют минимальные требования к аппаратной части, что позволяет выполнить предварительную компиляцию заранее. Вот этим и воспользовались в Windows Phone 8. Причем предварительная компиляция работает и для тех приложений, которые разработчики загружают на основе Windows Phone 7.x. В этом случае в магазине хранится две версии приложения. Если пользователь пробует установить приложение на устройство, например, Windows Phone 7.5, то тут выбирается тот .xap, который загрузил разработчик. А вот если у пользователя Windows Phone 8, то выбирается откомпилированная версия.

Written by Sergiy Baydachnyy

22.11.2012 at 17:20

Опубликовано в Windows Phone

Tagged with

Fast Application Switching в Windows Phone 8

leave a comment »

 

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

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

clip_image002

Выбрав нужное приложение из списка, пользователь возвращал его к жизни и мог продолжить работу с того момента, где завершил с ним работу ранее. Проблема в том, что не все пользователи до сих пор владеют этим методом или просто забывают о нем.

Если же пользователь запускает приложение из общего списка или через плитку на основном экране, то механизм уже не работает и приложение перезапускается с нуля. Ограничение по способам запуска было сделано специально, так как «вынимать» приложение из памяти не всегда правильно, а предугадать хотел бы это разработчик – невозможно.

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

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

 

<Tasks>
  <DefaultTask  Name ="_default" 
      NavigationPage="MainPage.xaml" ActivationPolicy="Resume"/>
</Tasks>

Внимание! Если у Вас по каким-то причинам оказалась RTM версия SDK для Windows Phone 8, которая распространялась примерно за месяц до официального релиза для всех разработчиков, то описанного выше атрибута там нет. Удалите RTM версию и загрузите последнюю версию с сайта.

Итак, давайте проверим работу этого атрибута. Для этого создайте новый проект и добавьте в класс App, наследник от Application, статическую переменную типа int, инициализированную каким-то значением. Например, вот такое объявление переменной:

public static int mem = 0;

Добавьте в проект еще одну страницу (Page1.xaml), а внутри MainPage.xaml реализуйте следующий код:

 

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="" Name="testTextBlock"></TextBlock>
        <Button Content="Go To Page 1" Click="Button_Click_1"></Button>
    </StackPanel>    
</Grid>

 

Все, что мы тут сделали, это разместили текстовое поле, куда будем выводить значение нашей статической переменной, а также добавили кнопку для навигации на другую страницу нашего приложения. Давайте теперь добавим код в MainPage.xaml.cs:

 

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    testTextBlock.Text = App.mem.ToString();
    base.OnNavigatedTo(e);
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    App.mem++;
    NavigationService.Navigate(new Uri("/Page1.xaml",UriKind.Relative));
}

 

 

Тут есть перегруженный метод OnNavigatedTo, где мы инициализируем наше текстовое поле, а также обработчик события, возникающего при нажатии на кнопку. Тут мы увеличиваем значение статической переменной и выполняем навигацию на новую страницу.

Попробуйте проделать следующие действия: запустите приложение (текстовое поле отобразит 0) и нажмите кнопку для перехода на другую страницу; перейдите в основное меню Windows Phone и снова запустите приложение. На экране отобразится MainPage со значением в текстовом поле 1. Иными словами, мы запустили не новую копию приложения, а «пробудили» ту копию, которая уже была в памяти. Значит, атрибут работает.

Если Вы все сделали правильно, то приложение завершило работу на странице Page1, а при перезапуске, мы оказались на странице MainPage. Такое поведение задано по умолчанию, но его можно изменить.

В зависимости от приложения, могут реализовываться два основных сценария:

· Приложение при перезапуске возвращается на главную страницу. При этом нужно понимать, что приложение осуществляет навигацию на главную страницу с предыдущей, то есть сохраняется весь стек навигации. Находясь на главной странице и нажав кнопку Back, пользователь может попасть на страницу с которой работал перед закрытием приложения. Такое поведение не всегда приемлемо, поэтому нужно программным образом очищать стек вызовов, имитируя запуск приложения с нуля;

· Приложение при перезагрузке оказывается на той странице, где пользователь завершил работу;

Рассмотрим оба сценария. Итак, чтобы понять, запущено приложение впервые или его работа возобновлена из памяти, нам понадобятся события Navigation и Navigated, описанные в классе Frame. В зависимости от значения NavigationMode в параметре этих событий, мы можем сделать вывод, что происходит с приложением. Обработчики этих событий лучше всего объявлять внутри App.xaml.cs, где и обрабатывать свойство NavigationMode, принимающее одно из значений: Back, Forward, New, Refresh, Reset. Первые два значения нас не очень интересуют, а вот New, Refresh и Reset будем пробовать обрабатывать.

Итак, рассмотрим первый сценарий, когда приложение должно отображать главную страницу, удаляя весь стек вызовов страниц при предыдущем запуске. Тут нужно знать, что при перезапуске приложения первоначальная навигация осуществляется именно на последнюю страницу, где был пользователь, а только потом переход происходит на главную. При этом NavigationMode принимает значение Reset на последней странице, где тут же вызывается навигация на главную страницу со значением New. Поэтому, если мы хотим очистить стек вызовов страниц с прошлого запуска, то достаточно проверить в обработчике события Navigated значение NavigationMode. В случае, если значение будет установлено в Reset (произошла инициализация на главной странице), нам нужно установить флажок, который будет сигнализировать о том, что во время навигации на главную страницу нужно очисть стек вызовов. В случае, если установлен флажок и значение NavigationMode содержит New, то мы выполнили навигацию при перезапуске приложения с последней страницы на главную и нужно очистить стек вызовов. Для этого используется следующий код:

 

while (RootFrame.RemoveBackEntry() != null)
{
    
}

 

Тут в цикле мы удаляем предыдущую страницу до тех пор, пока они предыдущих страниц не останется.

Если посмотреть на код App.xaml.cs сгенерированный по умолчанию, то можно найти уже готовую реализацию первого сценария. Именно при повторном запуске нашего примера, кнопка Back выполняет навигацию из приложения, вместо перехода на страницу Page1. Правда в сгенерированном коде вместо флажка используют дополнительный обработчик события Navigated, который подключают и отключают по мере необходимости:

 

private void CheckForResetNavigation(object sender, NavigationEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Reset)
        RootFrame.Navigated += ClearBackStackAfterReset;
}

private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
{
    RootFrame.Navigated -= ClearBackStackAfterReset;

    if (
     e.NavigationMode != 
       NavigationMode.New && e.NavigationMode != 
          NavigationMode.Refresh)
        return;

    while (RootFrame.RemoveBackEntry() != null)
    {
    }
}

 

Если мы хотим реализовать сценарий, при котором пользователь будет попадать на последнюю открытую страницу, то тут понадобится уже событие Navigation:

 

void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Reset)
    {
        cancelNavigation = true;
    }
    else if (e.NavigationMode == NavigationMode.New && cancelNavigation)
    {
        e.Cancel = true;
        cancelNavigation = false;
    }
}

 

 

Тут, если навигация осуществляется на старую страницу, то мы устанавливаем специальный флажок. А как только NavigationMode переходит в значение New и флажок установлен, это значит, что происходит навигация со старой страницы на главную. Вот тут мы и пользуется параметром Cancel нашего обработчика, обрывая навигацию и оставляя активной старую страницу. Естественно, что в этом случае код по удалению стека вызовов нам не нужен.

Свойство NavigationMode может принимать еще одно значение – Refresh. Это значение устанавливается в том случае, если повторный запуск ведет сразу на ту страницу, где мы покинули приложение в прошлый раз (например, завершили работу именно на главной странице приложения). Как и раньше, событие Navigated отрабатывает два раза, но если первый раз NavigationMode установлено в Reset, то второй раз – в Refresh. В этом случае разработчик сам принимает решение, нужно ли ему обновить содержимое страницы.

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

Written by Sergiy Baydachnyy

22.11.2012 at 15:25

Опубликовано в Windows Phone

Tagged with

Windows Phone 8 Camp в Киеве

leave a comment »

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

09:00 – 10:00 Регистрация, Кофе

10:00 – 11:00 Windows Phone 8: Общий обзор платформы (часть 1), Сергей Байдачный

11:00 – 12:00 Модель работы приложений в Windows Phone 8, Сергей Лутай

12:00 – 12:30 Кофе

12:30 – 13:30 Windows Phone 8: Общий обзор платформы (часть 2), Сергей Байдачный

13:30 – 14:30 Windows Phone 8: лучшие практики для разработки высококлассных приложений, Александр Краковецкий

14:30 – 15:30 Обед

15:30 – 16:30 C++ при разработке Windows Phone 8 приложений, Сергей Байдачный

Участие в событие бесплатное, но регистрация на событие обязательна и доступна по ссылке.

Written by Sergiy Baydachnyy

13.11.2012 at 09:46

Опубликовано в Windows Phone

Tagged with