현재 개발 중인 앱을 빌드하여 IOS에서 실행하면 잘 되는데,
안드로이드에서 Home 버튼을 눌렀다가 다시 앱으로 돌아오면 전역변수가 모두 초기화됩니다.
다른 앱을 실행하지 않고 바로 되돌아와도 이런 현상이 발생하는데 원인을 모르겠네요.
IOS와 달리 안드로이드에서는 Home 버튼을 누를 때 pause나 paused 이벤트가 발생하지 않고 Home 버튼 이벤트 캐치도 불가능하여 bencoding 모듈을 사용하여 foreground / background 전환을 감지하여 처리하고,
안드로이드 back 버튼을 누를 때는 아래 코드로 Home 버튼이 눌러지도록 하여 동일한 루틴으로 pause / resume 과정을 처리하고 있습니다.
function pressAndroidHomeButton() {
var intent = Ti.Android.createIntent({
action: Ti.Android.ACTION_MAIN
});
intent.addCategory(Ti.Android.CATEGORY_HOME);
Ti.Android.currentActivity.startActivity(intent);
}
또 윈도우를 생성할 때 exitOnClose 플래그를 설정해도 동작하지 않는 경우가 많아서
아래 함수를 대신 사용하고 있습니다.
function setExitOnClose(win) {
win.addEventListener(‘android:back’, pressAndroidHomeButton);
}
전역변수가 초기화되는 원인이 이 코드들에 있나 싶어서 모두 주석처리하고 실행해도 여전히 발생합니다.
의심되는 부분이 있으시면 좀 말씀해주시면 감사하겠습니다.
그리고 안드로이드에서 Home / Back 버튼을 처리하는데 표준화된 방법이 있나요?
다른 분들은 안드로이드에서 Home / Back 버튼 처리를 어떻게 하시는지 궁금합니다.
전역변수라고 하심은 어디서 선언한 변수이신가요?
Alloy.Globals가 초기화 되나요?
아니면, 겪으시는 문제가 앱이 재실행되시는건가요?
저는 안드로이드 back버튼에 대한 처리는 아래와 같이 합니다.
우선, window.open으로 띄운 윈도우는 back버튼을 누르면 window.close가 일어나니 따로 처리하지 않구요.
메인 윈도우=액티비티=index는 back버튼 이벤트를 받아서 view의 history대로 거슬러가 주도록 하고 있습니다.
최종적으로 history가 없으면 메인 윈도우=액티비티를 닫아주고 이 메인 윈도는 exitOnClose 속성을 가지고 있어서 앱이 종료됩니다.
home버튼에 대한 처리는 따로 하지 않습니다.
메인 윈도우가 살아 있으니 resume될 때 그 전 상태 그대로 동작합니다.
안드로이드는 액티비티 별로 각각 resume/pause 이벤트를 받을 수 있습니다.
주의 하실 점은 window.open으로 새 액티비티가 열리면, 메인 윈도우는 paused됩니다. (open된 액티비티가 close되면 resume되구요.)
방법은 아래 링크를 참고해주세요.
제가 전역변수라고 말씀드린 변수들은 app.js에 선언되어 다른 함수나 모듈들에서 그대로 사용할 수 있는 변수들입니다.
제가 C/C++ 개발을 해 온 터라 Alloy 프로젝트는 사용하지 않고 Classic 프로젝트로 시작을 한 상태라서 Alloy는 사용할 수 없습니다.
제가 구현하고자 한 기능은 Home / Back 버튼이 눌러지면 앱은 그대로 살아있지만 서버와의 소켓 접속은 끊어지도록 만들려고 합니다.
조언해주신 구현 방법과 차이점으로 보이는 부분은 제가 개발 중인 앱은 Home 버튼을 눌렀을 때 아무 처리를 하지 않으면 소켓이 계속 연결된 상태로 남아 있다는 것입니다.
그래서 Home과 Back 버튼을 동일한 pause 루틴을 실행하여 접속을 종료하도록 만들려고 하고 있습니다.