마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

현재 시간 구해올 때 질문 (missing 되는 시간이 있습니다.)

0 추천
타이머를 1초마다 부르면서 현재 시간을 가져오고 있습니다.

전체적인 구조는, 서비스에서 A.java (타이머가 있는 클래스)의 타이머를 시작해줍니다.

그리고 이 서비스는 OS가 Kill할 때 알람매니저를 설정해놔서, 다시 살아나도록 하였습니다. 실제 테스트시 정상적으로 잘 살아 납니다.

그리고 A.java의 타이머는 1초마다 현재시간을 가져옵니다. Calendar를 사용해서 가져오는데, 이게 Sleep Mode로 들어가고 한참 후에, 어느 시점부터 시간을 띄엄띄엄 가져오는 것 같습니다.

제가 Minute % 5 == 0 이 될 때 마다 발생시키는 이벤트가 있는데, 새벽에 로깅 된 것을 보니까 드문 드문 로깅이 되어 있더라구요..

이렇게 되는 이유가 무엇인지 궁금합니다. 서비스는 계속 살아있었구요. 슬립모드가 오래 지속될 경우 시간을 잘 못가져옵니다. 이런 현상을 피하기 위해서 어찌해야 할까요? 케이블을 컴퓨터와 연결해 놓으면 정상적으로 잘 동작하구요..

 

 조언부탁드립니다.
konori (530 포인트) 님이 2014년 7월 17일 질문
konori님이 2014년 7월 17일 수정

1개의 답변

0 추천
안녕하세요.

 

위는 일단은 OS의 oom_adj의 의한 동작으로 보입니다.

일반적으로 Android process는 (AOSP기준) 다음과 같은 priority를 갖게됩니다.

public static final int IMPORTANCE_PERSISTENT = 50

public static final int IMPORTANCE_FOREGROUND = 100;

public static final int IMPORTANCE_PERCEPTIBLE = 130;

public static final int IMPORTANCE_CANT_SAVE_STATE = 170;

public static final int IMPORTANCE_VISIBLE = 200;

public static final int IMPORTANCE_SERVICE = 300;

public static final int IMPORTANCE_BACKGROUND = 400;
public static final int IMPORTANCE_EMPTY = 500

 

이후에는 ActivityManagerService이후에 LRU 알고리듬으로 priority가 조정되게 됩니다.

private final int computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP, boolean doingAll, long now) {

 

위를 방지하기 위해서 WakeLock을 acquire하는 방법이 있긴하지만 Application의 power를 너무 많이 consume하게 되면 역시 좋은 디자인이 아니므로  적절한 acquire & release 정책을 세우는 방법을 추천 드립니다.
fanoyong (1,440 포인트) 님이 2014년 7월 17일 답변
좋은 답변 감사합니다!!
...