Flex: обнаружение простоя пользователя? - PullRequest
1 голос
/ 05 февраля 2010

Как узнать, когда пользователь бездействовал, скажем, 5 минут в моем приложении Flex?

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

Спасибо !!

Ответы [ 5 ]

6 голосов
/ 06 февраля 2010

См. Также событие idle в SystemManager. Этот подход работает для AIR или Flash Player.

application.systemManager.addEventListener(FlexEvent.IDLE, onIdle);

Вы можете получить время простоя (неподдерживаемым способом), используя

SystemManager.mx_internal::idleCounter
5 голосов
/ 05 февраля 2010

Поскольку это приложение AIR, я могу просто прослушивать событие USER_IDLE в NativeApplication

//Set seconds for idle
this.nativeApplication.idleThreshold = 5; 
//listen for user idle
this.nativeApplication.addEventListener(Event.USER_IDLE,lock); 
1 голос
/ 12 января 2012

Вы можете получить время, используя следующий код:

 <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="955" minHeight="600"
               initialize="init(event)">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.core.mx_internal;
            import mx.events.FlexEvent;

            protected function init(event:FlexEvent):void
            {
                systemManager.addEventListener(FlexEvent.IDLE, handleApplicationIdle);
            }

            private function handleApplicationIdle(event:FlexEvent):void
            {
                if(event.currentTarget.mx_internal::idleCounter == 60){
                    Alert.show("Time out happened");
                }
            }
        ]]>
    </fx:Script>
</s:Application>
1 голос
/ 05 февраля 2010

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

Если таймер закончился, то вы знаете, что пользователь простаивал в течение указанного времени.

// I am capturing only mouseMove and keyDown. That _should_ be enough to handle most user interactions.
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" mouseMove="onUserEvent" keyDown="onUserEvent">

...

private function onUserEvent(event:Event):void
{
    timer.reset();
}
0 голосов
/ 13 апреля 2012

@ Майкл Брюер-Дэвис

systemManager.addEventListener (FlexEvent.IDLE, onIdle) отлично работает для событий мыши.

А как насчет событий клавиатуры. Вы должны сосредоточиться на каком-то элементе, прежде чем systemManager будет прослушивать события клавиатуры.

Частичное решение : На событие applicationComplete я добавил следующую строку stage.addEventListener (KeyboardEvent.KEY_DOWN, handleKeyDown); Теперь события клавиатуры прослушиваются.

Недостаток: Работает только после того, как приложение щелкнуло по крайней мере один раз. Потом после работ нормально

Есть ли способ заставить приложение прослушивать события клавиатуры без хлопот одного раза Некоторые предлагали добавить «stage.focus = this». Также не сработало. (Еще нужно было нажать)

...