Статьи

Советы по мобильным приложениям Flex


После разработки нескольких демо-приложений с помощью Flex hero я хотел бы поделиться с вами некоторыми советами по улучшению поведения ваших родных приложений.
Сегодня Flash Builder Burrito (все еще в бета-версии) позволяет разрабатывать собственные приложения для устройств Android и BlackBerry PlayBook. Новый тег <s: MobileApplication> и новые мобильные компоненты Flex Hero значительно улучшают дизайн приложения. Это уже самая эффективная платформа для разработки многоэкранных приложений, и это только начало, поскольку Adobe будет добавлять все больше и больше поддерживаемых устройств.

То же видео на YouTube для моих китайских друзей: http://www.youtube.com/watch?v=7LDyYl6ksOU

СОВЕТ № 1: убить вашу заявку

Это недоразумение номер один с приложениями Android для разработчиков Flash. Когда вы выходите из приложения (например, нажимаете кнопку «Домой»), приложение все еще работает в фоновом режиме. Вы должны знать об этом поведении по умолчанию и контролировать его. Это очень мощное поведение, унаследованное от Android, но иногда оно может убить пользовательский опыт на смартфоне. Позвольте привести пример. API геолокации, представленный в AIR 2.5, возвращает ваши координаты в режиме реального времени. На Android он напрямую использует GPS API операционной системы, и мы все знаем, что он потребляет много ресурсов. В этом примере я просто запрашиваю свое местоположение с помощью API геолокации и отображаю широту в текстовом поле. Не забудьте добавить разрешение Android «ACCESS_FINE_LOCATION» в манифест XML.

На первом экране вы можете видеть, что мое приложение ищет мое местоположение, так как в строке состояния отображается значок GPS Android. Затем я нажимаю на кнопку домой (экран 2). GPS все еще работает в фоновом режиме !!! Если я смотрю на запущенные сервисы, приложение tip1quitHandler действительно все еще прекрасно работает. Это потребляет мои ресурсы даром.

Чтобы контролировать поведение вашего приложения, вы должны прослушивать событие DEACTIVATE в собственном приложении. Просто добавьте эти строки кода в ваш основной файл MXML:

 

<?xml version="1.0" encoding="utf-8"?>
<s:MobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
					 xmlns:s="library://ns.adobe.com/flex/spark"
					 firstView="views.tip1quitHandlerHome"
					 creationComplete="mobileapplication1_creationCompleteHandler(event)">
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
 
			protected function mobileapplication1_creationCompleteHandler(event:FlexEvent):void
			{
 
				NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, onDeactivateApp);
			}
 
			protected function onDeactivateApp(event:Event):void
			{
				NativeApplication.nativeApplication.exit();
			}
 
		]]>
	</fx:Script>
</s:MobileApplication>

В этом случае я просто убиваю приложение, когда пользователь возвращается на домашний экран. Вы также можете удалить прослушиватель событий в Geolocation и активировать его снова при запуске Event.ACTIVATE. Это дает вам больше свободы и контроля, чем когда-либо на Android.

СОВЕТ №2: Загрузите ваши данные перед просмотром

Это еще одна классическая ошибка из-за новой архитектуры MobileApplication. Если вам необходимо загрузить некоторые данные из Интернета, не вызывайте службу в представлении. Если вы это сделаете, вы будете запускать бесполезный запрос каждый раз, когда возвращаетесь к нему. Обновите основной файл приложения, чтобы вызвать вашу службу и нажать на представление о результате события. Удалите параметр firstView из тега MobileApplication и вызовите службу в событии creationComplete. Когда вы получите resultEvent, нажмите первый вид и передайте объект event.result как ArrayCollection.

protected function operation1():void
			{
				Operation1Result.token = speakersDevoxx.Operation1();
			}
 
			protected function mobileapplication1_creationCompleteHandler(event:FlexEvent):void
			{
				// TODO Auto-generated method stub
				operation1();
			}
 
			protected function Operation1Result_resultHandler(event:ResultEvent):void
			{
				// TODO Auto-generated method stub
				navigator.pushView(views.tip2devoxxHome,event.result as ArrayCollection);
			}


 

Посмотрите видео, чтобы узнать, как я использую мастер данных Flash Builder 4 для создания приложения, подключенного к службе DEVOXX REST, за 5 минут. Как только ваши данные загружены, они сохраняются между представлениями. В моем примере я получаю список ораторов и сохраняю его в коллекции Array. Когда я хочу отобразить сведения о динамике, я просто выдвигаю новый вид, передавая объект list.selectedItem. Благодаря AIR 2.5 вы также можете хранить данные локально в базе данных SQLite.

СОВЕТ № 3: Отображение пользовательской метки

Используйте рендеринг мобильных элементов, чтобы добиться максимальной производительности при прокрутке списков данных. Не забывайте, что вы также можете использовать параметр labelFunction в List вместо классического labelField. Типичный вариант использования — это когда вы хотите отобразить полное имя пользователя в списке. Например, если вы получаете только имя и фамилию от службы, используйте этот простой прием.

<fx:Script>
		<![CDATA[
			public function myFullName(obj:Object):String
			{
				return(obj.lastName + " " + obj.firstName);
			}
 
			protected function list1_clickHandler(event:MouseEvent):void
			{
				// TODO Auto-generated method stub
				navigator.pushView(views.mySpeaker, list.selectedItem);
			}
 
		]]>
	</fx:Script>
	<s:List id="list" width="100%" height="100%" dataProvider="{data}" labelFunction="myFullName" click="list1_clickHandler(event)">
 
	</s:List>

 

 

СОВЕТ № 4: Всегда объявляйте заставку

Ваше приложение AIR всегда будет запускаться за секунду. Платформа Flex Hero добавила в текущий класс Preloader твик для отображения изображения перед классической загрузкой. Всегда объявляйте заставку (просто статичное изображение) в своем основном теге MobileApplication, чтобы улучшить взаимодействие с пользователем. Всегда лучше приветствовать своих пользователей изображением, а не черным фоном. Для управления отображением заставки доступны несколько параметров «соотношения». Вы должны рассмотреть почтовый ящик и режимы масштабирования. Используйте параметры splashScreenImage и splashScreenScaleMode вашего приложения MobileApplication.

<s:MobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
					 xmlns:s="library://ns.adobe.com/flex/spark"
					 xmlns:speakersdevoxx="services.speakersdevoxx.*"
					  creationComplete="mobileapplication1_creationCompleteHandler(event)" title="Loading..."
					  splashScreenImage="@Embed('devoxxSplash.png')" splashScreenScaleMode="zoom">

СОВЕТ № 5: Проверьте ориентацию экрана

Я большой поклонник пользовательских макетов Flex 4. Вы можете прочитать мою статью о пользовательских макетах здесь: http://www.riagora.com/2010/05/flex-4-and-custom-layouts/ По умолчанию компонент List для мобильных устройств будет использовать класс VerticalLayout. В зависимости от того, что вы отображаете, VerticalLayout не всегда лучший выбор. В зависимости от ориентации вашего устройства (книжная или альбомная), вы также можете изменить макет, связанный с вашим списком. Когда я отображаю картинки, я предпочитаю TileLayout с ориентацией «строк», но когда я переключаюсь в ландшафтный режим, я предпочитаю TileLayout с ориентацией «столбцов». Вот два скриншота одного и того же приложения с использованием двух разных макетов в зависимости от ориентации экрана.

Слева вы можете любоваться портретным режимом, а справа — ландшафтным. Чтобы выяснить, когда пользователь поворачивает экран, я слушаю ResizeEvent в представлении … Я не уверен, что это лучший способ продолжить … но это работает:)

protected function checkOrientation():void{
				if(navigator.landscapeOrientation == true){
					currentState = "landScapeView";
				}else{
					currentState = "portrait";
				}
			}
 
			protected function onResizeView(event:ResizeEvent):void
			{
				checkOrientation();
			}

Затем просто объявите состояния вашего приложения и макеты, связанные с вашими состояниями:

<s:states>
		<s:State name="portrait"/>
		<s:State name="landScapeView"/>
	</s:states>
	<s:List width="100%"  height="100%" dataProvider="{myData}" itemRenderer="views.mySecondIR">
		<s:layout.portrait>
			<s:TileLayout orientation="rows"/>
		</s:layout.portrait>
		<s:layout.landScapeView>
			<s:TileLayout orientation="columns"/>
		</s:layout.landScapeView>
	</s:List>

 

 

СОВЕТ № 6: Используйте пользовательские макеты

Я просто попытался использовать свой собственный макет Coverflow, и я был удивлен удивительной производительностью на моих устройствах Android. Посмотрите видео, чтобы увидеть, как это работает.

СОВЕТ № 7: Ваши советы

Теперь мне нужны ваши советы. ;)Если вы нашли отличные приемы для улучшения работы пользователей Flex Mobile, пожалуйста, оставьте комментарий или ссылку на ваш блог.