2014-06-15 4 views
0

5 분마다 서버에서 업데이트를 가져 오는 Android 서비스가 있습니다. 화면이 켜져 있으면 잘 작동하지만 꺼져 있으면 일시 중지 된 것처럼 보입니다. start foreground()를 사용하여 서비스가 포 그라운드에서 실행된다는 점에 유의하십시오.화면이 꺼져 있으면 Android 서비스가 일시 중지되는 것 같습니다.

현재 새 스레드를 만들고 5 분마다 업데이트를 실행하기 위해 잠자기 상태로 만들 때 장치가 잠자기 상태 일 때 타이머가 계속 실행되도록하는 더 좋은 방법이 있습니까?

+0

"현재 새 스레드를 만들고 5 분마다 업데이트를 실행하기 위해 잠자기 상태로 만듭니다."- 시계 틱을보기 위해 사용자의 시스템 RAM을 낭비하지 마십시오. "장치가 잠자고있는 동안 타이머가 계속 실행되도록하는 더 좋은 방법이 있습니까?" -'WakefulBroadcastReceiver' 또는'WakefulIntentService' 패턴과 함께'AlarmManager'을 사용하십시오. – CommonsWare

답변

1

AlarmManager를 통해 알람을 사용하십시오. 알람이 CPU를 깨우므로 처리 할 수 ​​있습니다. 쓰레드에서 잠을 자고있는 중이면 전화기가 꺼져 있으면 절전 모드가 해제됩니다.

물론 실제 다운로드를 수행하려면 백그라운드 스레드 나 태스크가 필요합니다. 그것이 wockelock이 들어오는 곳입니다. 알람이 울리면 wockelock을 요청하십시오. 확인/다운로드가 끝나면 놓습니다. 귀하의 경우, 동일한 아키텍처를 유지할 수 있습니다. 재검사를 기다리는 5 분 수면 대신, 세마포를 기다리십시오. 알람이 들어 오면 wockelock을 요청하고 세마포 신호를 보냅니다. 검사가 끝나면 wakelock과 세마포어를 해제 한 다음 다시 기다립니다.

+0

감사합니다. 나는 세마포어없이이 작업을 수행 할 수있었습니다. 나는 그것들을 조금 읽었지 만, 나는 그것이 어떤 목적을 위해 사용될 것인지 아직 확실하지 않다. 그 점을 분명히 해 주시겠습니까? –

+0

이벤트를 기다려야하는 스레드가 있으면 세마포를 기다립니다. 그런 다음 이벤트를 보는 코드 부분에서 세마포를 해제합니다. 그러면 다른 스레드가 깨어나서 실행됩니다. 이 방법은 코드가 이벤트가 발생한 후에 만 ​​실행할 수 있습니다. 물론 그것을 수행하는 다른 방법들도 있습니다. 단지 하나의 공통되고 효율적인 방법입니다. –

1

화면을 끌 때 전화가 잠자기 상태이기 때문에 업데이트가 진행되지 않습니다. "최적화 된 WiFi"모드가 켜지면 WiFi에서 더 자주 발생합니다.

너는 wakelocks을 봐야한다. 장치가 잠들지 않도록 막음을 확보하십시오. 그것을 놓아서 다시 잠들게하십시오. 이것은 분명히 배터리 소모를 증가시킨다.