Flash / AIR. Работа с приложением.



AIR. Работа с приложением.:

В этой статье мы научимся работать с AIR классом NativeApplication.


Как вы помните, в предыдущей статье я вскользь упомянул про класс NativeApplication, в этой же статье мы познакомимся с ним очень близко. Что это вообще за класс и зачем он нужен? Этот класс на самом деле и является нашим приложением. То есть если любое окно в AIR, главное или еще какое-либо, это не важно, представляет собой экземпляр класса NativeWindow, то класс NativeApplication представляет собой собственно наше приложение. Если порассуждать логически, то мы придем к выводу, что для каждого приложения экземпляр этого класса должен быть только один. Так и есть. Более того, вы не сможете создать экземпляр класса NativeApplication вручную, он создается автоматически при запуске приложения. Получить же ссылку на него можно через свойство nativeApplication класса NativeApplication.

Объект NativeApplication содержит много информации о приложении, давайте посмотрим что мы можем узнать о приложении через него.

Объект NativeApplication содержит много информации о приложении, давайте посмотрим что мы можем узнать о приложении через него.

Свойства:
activeWindow:NativeWindow – содержит ссылку на окно, которое в данный момент находится в фокусе мыши или клавиатуры. Если вам необходимо узнать с каким окно работает в данный момент пользователь, вы можете сделать это через свойство activeWindow.
applicationDescriptor:XML – возвращает значения всех дескрипторов приложения в виде XML.
applicationID:String [только для чтения] – возвращает идентификатор приложения. Как вы помните он задается в дескрипторе id при упаковке приложения в *.air файл.
runtimePatchLevel:uint [только для чтения] – возвращает номер исправления AIR, в котором запускается данное приложения. Суть в том, что помимо основной версии AIR, например 3.0, Adobe периодически выпускает мелкие исправления, которые никак не тянут на то, чтобы из-за них присваивать текущей версии AIR следующую, поэтому после основной версии AIR добавляется номер исправления, который установлен на эту версию AIR. Например 3.1.0.4880. Здесь номер установленного исправления – 4880.
runtimeVersion:String [только для чтения] – возвращает полный номер версии AIR в которой запущено текущее приложение.
openedWindows:Array [только для чтения] – возвращает массив всех открытых окон данного приложения. Мы уже знакомы с этим свойством.
Пример:
trace("Active Windows: " + NativeApplication.nativeApplication.activeWindow);
trace("ApplicationID: " + NativeApplication.nativeApplication.applicationID);
trace("RuntimePatchLevel: " + NativeApplication.nativeApplication.runtimePatchLevel);
trace("RuntimeVersion: " + NativeApplication.nativeApplication.runtimeVersion);
trace("OpenedWindows: " + NativeApplication.nativeApplication.openedWindows);
trace(NativeApplication.nativeApplication.applicationDescriptor);
 
Active Windows: [object NativeWindow]
ApplicationID: net.redefy.example
RuntimePatchLevel: 4880
RuntimeVersion: 3.1.0.4880
OpenedWindows: [object NativeWindow],[object NativeWindow]
 
<application xmlns="http://ns.adobe.com/air/application/3.1">
  <id>net.redefy.example</id>
  <name>TestApplication</name>
  <description>Тестовое приложение</description>
  <installFolder>redefy</installFolder>
  <programMenuFolder>TestAplication</programMenuFolder>
  <versionLabel>Версия 1.0</versionLabel>
  <versionNumber>1.0</versionNumber>
  <filename>example</filename>
  <copyright>© 2012, redefy.net, Inc.All rights reserved</copyright>
  <initialWindow>
    <title>TestApplication</title>
    <content>example.swf</content>
    <systemChrome>standard</systemChrome>
    <transparent>false</transparent>
    <visible>true</visible>
    <minimizable>true</minimizable>
    <resizable>true</resizable>
    <x>190</x>
    <y>120</y>
    <width>550</width>
    <height>400</height>
    <minSize>150 100</minSize>
    <maximizable>true</maximizable>
    <renderMode>direct</renderMode>
  </initialWindow>
  <icon>
    <image57x57>icons/example57.png</image57x57>
    <image16x16>icons/example16.png</image16x16>
    <image29x29>icons/example29.png</image29x29>
    <image32x32>icons/example32.png</image32x32>
    <image36x36>icons/example36.png</image36x36>
    <image48x48>icons/example48.png</image48x48>
    <image72x72>icons/example72.png</image72x72>
    <image128x128>icons/example128.png</image128x128>
  </icon>
</application>
Кстати, я надеюсь вам уже стали понятны дескрипторы которые находятся внутри дескриптора initialWindow. Они все всего лишь описывают как будет выглядеть главное окно приложения. После предыдущей статьи, вам должно быть понятно какой дескриптор за какой параметр отвечает.
Хорошо, двигаемся дальше.
С помощью объекта NativeApplication и метода activate() мы можем установить фокус ОС на какое-нибудь окно.
activate(window:NativeWindow = null):void – переключает фокус ОС на окно переданное в качестве параметра этому методу.
Мы можем отследить когда приложение находится в фокусе ОС, а когда нет. Заметьте, не какое-нибудь отдельное окно, а именно приложение. Для этого мы можем подписать объект NativeApplication на соответствующие события:
Event.ACTIVATE – отправляется, когда фокус ОС устанавливается на приложении.
Event.DEACTIVATE – отправляется, когда фокус ОС перемещается с приложения на рабочий стол.
NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handlers);
NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handlers);
По умолчанию, приложение AIR завершает свою работу когда закрывается последнее открытое окно. При этом отправляется событие Event.EXITING, слушая которое можно в зависимости от текущего состояния приложения или разрешить приложению завершить свою работу или же нет.
Но это поведение можно изменить. Если вы установите свойcтво autoExit объекта NativeApplication в false, то приложение завершит работу только если вы вызовите метод exit().
NativeApplication.nativeApplication.autoExit = false;
NativeApplication.nativeApplication.exit();
В случае, когда приложение завершает свою работу с помощью метода exit(), событие Event.EXITING не отправляется.

Обнаружение бездействия со стороны пользователя.

В AIR есть очень полезная возможность. Мы можем узнать когда пользователь не работает с приложением, допустим он отошел куда-то, и заставить приложение предпринять какие-то действия. Например, если пользователь не вернулся к работе через 10 минут мы можем заставить приложение свернуться.
У объекта NativeApplication есть свойство idleThreshold:int, которое определяет через сколько секунд должно быть отправлено событие Event.USER_IDLE, слушая которое мы можем заставить приложение выполнить какие-то действия. По умолчанию это свойство имеет значение 300 секунд (5 минут), но легко может быть изменено на другое значение. Стоит только знать, что это значение должно находится в диапазоне от 5 (5 секунд) до 86 400 (1 день) включительно. Еще один момент, это свойство должно быть изменено до подписки на событие Event.USER_IDLE, иначе будет учитываться старое значение свойства idleThreshold. После того как пользователь опять возвращается к работе, допустим двинет мышку или нажмет какую-нибудь клавишу, приложение отправляет событие Event.USER_PRESENT, слушая которое можно например разворнуть приложение в исходное состояние. А что удобно, пользователь отошел от компьютера, приложение свернулось, вернулся к нему, приложение развернулось :)
NativeApplication.nativeApplication.idleThreshold = 5;
NativeApplication.nativeApplication.addEventListener(Event.USER_IDLE, handlers);
NativeApplication.nativeApplication.addEventListener(Event.USER_PRESENT, handlers);
Есть еще свойство timeSinceLastUserInput:int [только для чтения], которое содержит время в секундах с момента последнего пользовательского ввода. Как только пользователь перестает двигать мышку или тыкать по клавишам, это свойство начинает увеличиваться на 1 каждую секунду, после того как пользователь опять тыкнет какую-нибудь клавишу на клавиатуре или двинет мышку, это свойство сбрасывается на 0. Может когда-нибудь и понадобится такая возможность.

Автоматический запуск приложения при входе пользователя в систему.

Обычно, приложение AIR запускается только после того как пользователь два раза щелкнет по приложению. Но можно сделать и так, чтобы приложение запускалось автоматически при входе пользователя в систему. Для этого необходимо установить свойство startAtLogin объекта NativeApplication в true. Но знайте, что для того чтобы приложение запускалось автоматически оно должно быть установлено в системе. Если вы установите свойство startAtLogin в true и попытаетесь запустить приложение на этапе разработки, то получите ошибку времени выполнения. Не все ОС позволяют запускать приложение при старте системы. Например, на мобильных устройствах эта возможность не поддерживается. Чтобы знать наверняка, поддерживает ОС в которой запущено приложение эту возможность, можно обратится к статическому свойству supportsStartAtLogin объекта NativeApplication. Свойство будет содержать значение true, если текущая ОС поддерживает автоматический запуск приложения.
При старте приложения отправляется событие InvokeEvent.INVOKE. Рекомендую, создавать новые окна только после наступлении этого события. При повторном запуске приложения, его копия не создается. Вместо этого объекту NativeApplication опять посылается событие InvokeEvent.INVOKE. У объекта InvokeEvent есть свойство reason, которое может содержать в себе одно из двух значений:
InvokeEventReason.LOGIN : String = «login – указывает, что событие InvokeEvent произошло вследствие входа пользователя в систему.
InvokeEventReason.STANDARD : String = «standard» – указывает, что событие InvokeEvent произошло по причине, отличной от входа в систему.

Установка приложения в качестве приложения по умолчанию для определенных типов файлов.

В AIR можно привязать приложение к одному или нескольким типам фалам. При этом при клике по любому файлу этого типа AIR-приложение, которое к нему привязано, будет автоматически запущено, если оно не было запущено ранее, и этому приложению будет отправлено соответствующее событие, обрабатывая которое можно произвести какие-то действия с этим файлом. Если приложение уже было запущено при клике по этому типу файлов, то вторая копия приложения не запускается, а приложению просто отсылается событие, сигнализирующее об этом действии со стороны пользователя. Об обработке такого события мы поговорим позже, когда будет разбираться в том, как работает AIR с файловой системой пользователя. На данный момент мы будем учится устанавливать наше приложение как приложение по умолчанию для какого-либо типа файлов. Есть четыре метода класса NativeApplication, которые предоставляют все необходимое для осуществления этого действия. Но не стоит торопится. Вначале, нужно сказать, что мы не сможем установить наше приложение приложением по умолчанию для любых типов файлов. Вернее не совсем так. Помните я вам говорил что мы разобрали не все возможные дескрипторы приложения. Так вот, есть такой дескриптор fileTypes, который может содержать один или более дескрипторов fileType. В каждом дескрипторе fileType должна находится информация о каком-то типе файлов, например *.mp3. Расширения могут какие-угодно, и придуманные вами и используемые другими программами. Так вот, приложение AIR может стать приложением по умолчанию только для тех типов файлов, которые определены в дескрипторе fileTypes.
Можно воспользоваться GUI FlashDevelop чтобы быстро настроить этот дескриптор:

Рис 1.1 Настройка дескриптора fileTypes
Дескриптор fileType содержит следующие дескрипторы:
Дескриптор name (в GUI называется Name) – определяет имя файла. Должно быть уникальным. Можно например использовать схему именования пакетов: net.redefy.mp3
Дескриптор description (в GUI называется Description) – описание файла. Можете кратенько описать предназначение этого файла.
Дескриптор extension (в GUI называется Extension) – определяет расширение файла. Расширение не должно содержать символы «*» и «.».
Дескриптор contentType (в GUI называется Content Type) – тип содержимого MIME. Список типов MIME можно посмотреть например здесь.
Кроме того вы можете определить иконки для этого типа файлов. С этими иконками файлы будут отображаться в системе пользователя в случае когда приложение AIR устанавливается для этого типа файлов, как приложение по умолчанию. Иконки устанавливаются с помощью уже знакомых дескрипторов icon и image.
Ниже пример использования этих дескрипторов для mp3 файлов:
<fileTypes>
    <fileType>
      <name>net.redefy.mp3</name>
      <extension>mp3</extension>
      <description>Тестируем связь с mp3</description>
      <contentType>audio/mpeg</contentType>
   <icon> 
            <image16x16>icons/AIRApp_16.png</image16x16>       
            <image32x32>icons/AIRApp_32.png</image32x32>       
            <image48x48>icons/AIRApp_48.png</image48x48>      
            <image128x128>icons/AIRApp_128.png</image128x128> 
        </icon> 
    </fileType>
</fileTypes>
Стоит сказать что при установке приложения AIR на компьютер пользователя, возможно два варианта дальнейшего развития событий: 1) Если для расширений файлов определенных в дескрипторе fileTypes не определенно никакого приложения по умолчанию, то это установленное приложение становится приложением по умолчанию для этих типов файлов, 2) Если же для этих типов файлов уже определено приложение по умолчанию, то текущее установленное приложение не будет определенно для них как приложение по умолчанию. В этом случае вам придется кодом реализовать это.
Хорошо, как определить расширения файлов для которых приложение AIR может стать приложением по умолчанию мы разобрали, вернемся к NativeApplication.
Не все ОС поддерживают установку приложения AIR в качестве приложения по умолчанию для каких-либо типов файлов. С помощью статического свойства supportsDefaultApplication объекта NativeApplication мы можем узнать поддерживается эта возможность или нет. Если свойство возвращает true, то такая возможность поддерживается, если false, то соответственно не поддерживается.
Теперь давайте знакомится с упомянутыми выше 4 методами:
getDefaultApplication(extension:String):String – возвращает имя приложения, которое определенно для указанного типа файлов в качестве приложения по умолчанию. Помните, вы можете проверить так только те типы файлов, которые перечислены в дескрипторе fileTypes.
isSetAsDefaultApplication(extension:String):Boolean – указывает, является ли текущее приложение AIR приложением по умолчанию для указанного типа файлов.
Пример. В дескрипторе fileTypes у меня определены два типа файлов *.mp3 и *.avi. Посмотрим какую информацию о них, возвратят мне эти два метода:
trace("Приложение по умолчанию для *.mp3: " + NativeApplication.nativeApplication.getDefaultApplication("mp3"));
trace("Приложение по умолчанию для *.avi: " + NativeApplication.nativeApplication.getDefaultApplication("avi"));
trace("MP3: " + NativeApplication.nativeApplication.isSetAsDefaultApplication("mp3"));
trace("AVI: " + NativeApplication.nativeApplication.isSetAsDefaultApplication("avi"));
 
Приложение по умолчанию для *.mp3: E:\Program Files\AIMP2\AIMP2.exe
Приложение по умолчанию для *.avi: F:\Program Files\The KMPlayer\KMPlayer.exe
MP3: false
AVI: false
Последние два метода позволяют установить приложение AIR в качестве приложения по умолчанию для определенного типа файлов или отменить эту связь:
setAsDefaultApplication(extension:String):void – задает это приложение в качестве приложения по умолчанию для обработки файлов с указанным расширением.
removeAsDefaultApplication(extension:String):void – отменяет использование этого приложения в качестве приложения по умолчанию для обработки файлов с указанным расширением.
Стоит сказать? что последние два метода будут работать корректно, только если приложение установлено в системе пользователя.
На этом все. Мы рассмотрели не все методы и свойства класса NativeApplication, в оставшихся мы будем разбираться по мере необходимости. В следующей статье мы научимся создавать меню для окон.
Удачи. И до скорого.