2016-10-27 10 views
0

나는이 문제로 끝내고있다. 그것을위한 좋은 해결책을 찾을 수 없습니다! 내 애플 리케이션에서 나는 타이머가 반복해서 반복되는 서비스를 가지고있다. 즉, 각 timerTask가 실행 된 후 다른 타이머가 시작됩니다 (먼저 timer 및 timerTask가 취소 된 다음 새 Timer 및 TimerTask가 할당됩니다). 이것은 하루 24 시간 일합니다! 먼저 앱을 실행하고 서비스를 시작한 다음 디스플레이를 끄고 기기를 그대로 두십시오. 하지만 문제는 내가 장치로 돌아올 때마다, 내 애플 리케이션이 몇 가지 작업을 마쳤다는 것을 알게된다. 나는 이것이 CPU가 잠자고 있기 때문이라고 생각한다.안드로이드, 디스플레이가 꺼져있을 때 CPU를 켜 놓으시겠습니까?

자세한 설명을 위해 시간 간격 목록 (초)을 {601004012080}으로 가정합니다. 서비스를 시작하고 장치를 5 분 동안 그대로 두십시오. 그 다음 나는 되돌아와, 60와 100 초에 작업이하게되는 것을 본다. 그러나 서비스는 40시에 작업에 붙어 있습니다!

각 작업에는 기껏해야 5 초가 소요되는 매우 간단한 네트워크 작업이 포함됩니다. wakelock을 시도했지만 도움이되지 않습니다. 나는 이유를 모른다!

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    startForeground(id, new Notification()); 
    pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,""); 
    wl.acquire(); 
    doAction(); 
    return START_STICKY; 
} 

private void doAction(){ 
    if (timer != null) 
     timer.cancel; 
    if (timerTask != null) 
     timerTask.cancel; 
    timer = new Timer(); 
    timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       doAction(); 
       //Do some network job! 
      } 
    }; 
    timer.schedule(timerTask, getNewInterval()); 
} 
+0

을 사용하여 알람을 재설정 할 수 있습니다.이 장치는 항상 충전기에 연결 되나요? – CommonsWare

+0

아니요! 그렇지 않습니다. – Jay

+0

~ 40-120 초마다 네트워크 I/O를 하루 종일 계속하는 것은 Google이 Android 6.0 이상에서 이러한 앱이 실행되지 않도록 조치를 취한 이유입니다. 사용자들은 안드로이드 기기의 배터리 성능 저하에 대해 지난 몇 년 동안 지속적으로 불만을 제기 해 왔으며, 그 중 많은 부분은 개발자가 제안한 바를 수행하는 사람들에게 돌아옵니다. 사용자가 기기를 하루에 몇 번씩 충전해야하는 부담을 감당할만큼 앱을 소중하게 생각합니까? – CommonsWare

답변

1

당신은 가동 잠금을 유지하지 않아야 어쩌면 일부 전력 관리 시스템 기능이 때문에 서비스를 죽이고 : 여기

내 서비스의 코드입니다.

WakefulBroadcastReceiver

AlarmManager

및 IntentService와 예를 들어 결합 된 첫 번째 옵션 또는 두 번째는 사용자의 요구 사항을 충족 할 수없는 경우 참조 : 대한 설명서를 참조하십시오. AlarmManager에 의해 또 다른 순간으로, 심지어 정확하게는 setExact()

+0

답변 해 주셔서 감사합니다. 알겠습니다! – Jay