[안드로이드 공부]/안드로이드 공부

[안드로이드] 홈키 5초룰을 아시나요?

코코모모 2015. 10. 7. 10:17

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

앱을 테스트 하던 중, 이벤트를 받고 startActivity를 했는데, mainActivity가 화면에 2-3초 후에 나타나는 현상이 발생했습니다. 왜 이렇게 느리지 하는 생각이 들어 개선점을 찾아 보기로 했지요.


속도를 개선해야 겠다 화면을 많이 그려서 그런가... 리소스를 잡아먹는 코드가 있나 고민에 빠졌죠.

코드를 이것저것 빼도 전혀 빨라지지가 않네요.


그런데 이것저것 테스트를 하는 중에 Back 키로 앱을 나간 후 실행하면 바로 뜨고, Home 키로 나간 후 실행하면 뜨지 않는다는 차이점을 발견했지요.


홈 키는 뭐가 다를까?

검색을 해 보니 안드로이드에는 일명 5초 룰 이라는 것이 있네요.

홈키로 앱을 숨기면 그 activity는 백그라운드에서 startActivity를 해도 5초 동안 꼼짝하지 않는 것이지요.


이런 룰이 있는 이유는 developer 사이트에서 약간이나마 알 수 있네요.


http://developer.android.com/guide/practices/seamlessness.html#interrupt


[Don't interrupt user]라는 섹션에서 설명한 게 이유가 될 거 같아요.


해석을 제 나름대로 해 보면,

유저가 홈키를 눌러 다른 곳(전화 등)으로 갔으면 명시적으로(on purpose) 다른 앱을 사용하는 것인데, 백그라운드에서 다른 activity를 실행한다면 유저에게 혼란을 준다는 이유로 만들어진 룰이네요.


그래서 바로가기를 눌러서 다시 실행하면 유저가 실행하겠다는 의지가 있는 것이니 딜레이 없이 실행이 되는 것이지요.


안드로이드 framework 소스를 확인해 보면 ActivityManagerService.java 에서 다음과 같이 관련 코드가 보입니다.

static final long APP_SWITCH_DELAY_TIME = 5*1000;

...

...

public void stopAppSwitches() {
if (checkCallingPermission(android.Manifest.permission.STOP_APP_SWITCHES)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires permission "
+ android.Manifest.permission.STOP_APP_SWITCHES);
}

synchronized(this) {
mAppSwitchesAllowedTime = SystemClock.uptimeMillis()
+ APP_SWITCH_DELAY_TIME;
mDidAppSwitch = false;
mHandler.removeMessages(DO_PENDING_ACTIVITY_LAUNCHES_MSG);
Message msg = mHandler.obtainMessage(DO_PENDING_ACTIVITY_LAUNCHES_MSG);
mHandler.sendMessageDelayed(msg, APP_SWITCH_DELAY_TIME);
}
}



코드에서 힌트를 얻자면,

STOP_APP_SWITCHES permission를 주면 딜레이 없이 실행 될 수도 있지 않을까하는 생각이 들지만,

system apps이 아닌 보통의 앱은 설정할 수 없는 퍼미션이네요.


제조사와 협의하든지, 폰을 루팅하지 않으면 쓸 수 없는 걸로 보입니다.

그래서 결론은, 백그라운드(broadcast나 service 등)에서 activity를 실행한다면, 딜레이 후 화면이 뜨는 것은 극복하기 어렵겠네요. 노티로 곧 앱이 실행될 것임을 알리든지 하는 방법으로 우회가 필요하겠습니다.

참고 사이트:


모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.