반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함

Handling Corona System Events

2012. 5. 22. 11:06 | Posted by 솔웅


Handling Corona System Events

어플리케이션을 개발 할 때 유저가 다양하게 여러분의 앱을 다루게 되는데 그에 대해 어떤 동작을 할 수 있도록 기능을 구현하는것은 아주 중요합니다. 또한 유저가 의도했던 안했던 다양한 system 에 대해 반응하는 것도 아주 중요합니다.


예를 들어 만약에 여러분의 앱을 사용하고 있는 중간에 유저에게 전화가 걸려온다던가 혹은 유저가 home 버튼을 누를 수도 있겠죠, 이 경우엔 여러분의 앱은 background에서 작동하고 있을겁니다. suspended나 paused 상태가 되서 말이죠.). 이렇게 suspended 된 상황에서 유저가 다시 앱으로 돌아왔을 때나 앱을 완전히 exit 했을 때도 발생할 수 있습니다.


코로나에서는 이러한 모든 것들을 system 이벤트에서 처리합니다. 오늘은 이 system 이벤트에 대해서 다룰겁니다.





Event Listener

여러분의 코로나 앱에서 system event 모니터링을 시작하기에 앞서 listener 함수를 set up 해야 합니다. 그리고 system 이벤트 리스너 를 add 하셔야 합니다. 만약 여러분이 코로나의 events 와 친하지 않으시다면 The Corona Event Model Explained document 를 먼저 보시고 다음 진도를 나가시라고 권해드립니다.

아래 코드는 event listener를 어떻게 set up 하는지를 보여드립니다. 그리고 글로벌 Runtime object를 add 합니다.  (이 object는 유일하게 system 이벤트를 listen 할 수 있는 object 입니다.)

local function onSystemEvent( event )

    -- Test for different event types here

end
Runtime:addEventListener( "system", onSystemEvent )

applicationStart


local function onSystemEvent( event )
    if event.type == "applicationStart" then

        do_something()

    end
end


위의 샘플코드는 여러분의 system event listener에서 applicationStart 이벤트를 어떻게 테스트 하는지 보여드립니다.

main.lua 가 가동되고 앱이 시작될 때 이 applicationStart 이벤트를 받습니다.

applicationExit

local function onSystemEvent( event )
    if event.type == "applicationExit" then

        do_something()

    end
end


applicationexit 시스템 이벤트는 앱이 끝나기 바로 직전에 dispatch됩니다. (suspending 이 아니라 완전히 끝날 때 입니다.) 이것은 유저가 끝낼 수도 있고 어떤 이유에서인가 시스템이 끝낼수도 있습니다. (메모리 부족 등)

이 이벤트는 앱이 끝나기 직전에 데이터를 저장하고 디비 연결을 끊는 일을 해야 할 때 많이 사용됩니다.

applicationSuspend

local function onSystemEvent( event )
    if event.type == "applicationSuspend" then

        do_something()

    end
end


앱이 실행중에 전화가 온다던가 아니면 유저가 switch out 시킨다던가 또는 유저가 power 버튼을 눌러서 디바이스를 sleep 상태로 돌릴때 여러분의 앱은 suspend 상태로 됩니다. (끝나지는 않은 상태입니다.)

suspended state로 가기 직전에 applicationSuspend 이벤트가 dispatch 됩니다. 이 이벤트를 이용해서 게임을 pause 시키는 일 등을 하실 수 있습니다. (그러면 다시 앱으로 돌아올 때 유저는 이 pause 화면을 볼 수 있을 있겠죠.) 그리고 필요하면 시간을 mark 할 수도 있고 timer나 transision 들을 pause나 stop 시킬 수도 있습니다.

applicationResume

local function onSystemEvent( event )
    if event.type == "applicationResume" then

        do_something()

    end
end


suspended 되기 전에 무엇인가를 할 수 있듯이 앱이 다시 돌아올 때도 무엇인가를 할 수 있습니다. 이렇게 앱이 다시 돌아오자마자 applicationResume 이벤트가 dispatch 됩니다.

Putting it all together

local function onSystemEvent( event )
    if event.type == "applicationStart" then

        -- this block executed when application launches (after main.lua)

    elseif event.type == "applicationExit" then

        -- this block executed just prior to the app quitting
        -- OS closes least recently used app, user explicitly quits, etc.

    elseif event.type == "applicationSuspend" then

        -- this block executed when app goes into "suspend" state
        -- e.g. user receives phone call, presses home button, etc.

    elseif event.type == "applicationResume" then

        -- this block executed when app resumes from "suspend" state
        -- e.g. user goes back into app (while it is still running in bg)

    end
end
Runtime:addEventListener( "system", onSystemEvent )


위 예제는 system event listener 의 기본 골간입니다. 이 예제를 탬플릿으로 사용하셔서 이용하시면 편하실 겁니다. 저 안에 어떤 동작을 넣을 지는 여러분 필요에 따라 구현하셔야겠죠.

이 기능들이 모든 앱에서 반드시 사용되어야 하는 것은 아니지만 많은 경우에 이 기능을 이용하면 아주 훌륭한 앱이 되도록 구현할 수 있을 겁니다.

여러분의 앱을 release 하시기 전에 내 앱이 suspended mode로 됐을 때 내 앱은 어떻게 해야 할까? 다시 돌아올 때는 무엇을 할까? 를 한번 생각 해 보세요. 여러분 앱이 훨씬 수준있는 앱이 될 수 있을 겁니다.



반응형

Comment