2014-12-01 12 views
1

포어 그라운드에서 실행되는 dummy IntentService을 만들었습니다. 기본적으로 5 초마다 얼마나 오래 깨어 있었는지 기록합니다. 이것은 WakeLock 권한 없이도 테스트 장치에서 몇 시간 동안 실행되었습니다. 또한, 배터리 수명을 전혀 손상시키지 않는 것처럼 보입니다. 기기의 배터리 상태에 배터리의 1 %까지 사용하는 것으로 표시되지 않습니다. WakeLock 없이도이 서비스를 계속 실행할 수 있습니까?왜 IntentService에 WakeLock이 필요하지 않습니까?

업데이트 : 내가이 사실을 발견했습니다. 서비스가 실제로 잠을 자고있는 것 같지만, 상당히 모순이 있습니다. 일부 로그 문을 살펴보면 스레드가 5 초 동안 만 잠자기 상태가 되어도 깨어 난 후에도 시스템이 서비스를 일시 중지 한 것처럼 보일 수 있습니다. 시간은 17:56:31에서 17:56:54에서 17:57:05로 점프합니다. 23 초 점프와 9 초 점프. 이것이 왜 가장 도움이되는지에 대한 설명. 고맙습니다.

12-01 17:56:31.479 8723-8780/com.example.timedrift D/Done Sleeping﹕ Active for 2375000 Seconds 
12-01 17:56:54.630 8723-8780/com.example.timedrift D/Done Sleeping﹕ Active for 2380000 Seconds 
12-01 17:57:05.632 8723-8780/com.example.timedrift D/Done Sleeping﹕ Active for 2385000 Seconds 
12-01 17:57:11.097 8723-8780/com.example.timedrift D/Done Sleeping﹕ Active for 2390000 Seconds 
12-01 17:57:16.098 8723-8780/com.example.timedrift D/Done Sleeping﹕ Active for 2395000 Seconds 
12-01 17:58:00.829 8723-8780/com.example.timedrift D/Done Sleeping﹕ Active for 2400000 Seconds 

IntentService :

@Override 
protected void onHandleIntent(Intent intent) { 

    Notification notification = new Notification(R.drawable.ic_launcher, "Time", 
      System.currentTimeMillis()); 
    Intent notificationIntent = new Intent(this, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
    notification.setLatestEventInfo(this, "Time", 
      "Time", pendingIntent); 
    startForeground(100, notification); 

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = sharedPrefs.edit(); 

    try { 
     Log.d("TimerService", "Start"); 
     int i = 1; 
     while(true){ 
      Thread.sleep(5000); 
      int numberOfSeconds = i++*5; 
      Log.d("Done Sleeping", String.valueOf("Active for "+numberOfSeconds+" Seconds")); 
      editor.putLong(String.valueOf(numberOfSeconds), numberOfSeconds); 
      editor.apply(); 
     } 


    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 
+1

일부 관련 설명 http://android.stackexchange.com/questions/69693/how-do-timers-and-alarms-function-while-the-device-is-sleeping – zapl

답변

2

당신이 실제로 제공하는 타이밍 데이터는 전체 장치가 절전 모드로 전환되는 것을 보여 않습니다. sleep()로 전화하면 현재 사용중인 Service의 스레드가 5 초 동안 잠 들어 있습니다. 스케줄러는 일반적으로 이러한 유형의 작업에서 +/- 10ms입니다. wakelock이 없으면 시스템 전체가 잠자기 상태가되어 서비스 수명주기에 영향을 미치지 않습니다. 기기의 다른 항목 (네트워크 이벤트, 알람, 기타 서비스 등)이 시스템을 깨우고 있습니다. 그러면 다음 번 잠자기 전에 앱이 예약됩니다. 귀하의 서비스가 포 그라운드 서비스라는 사실은 자원이 적기 때문에 사망 위험을 최소화하지만 시스템의 저전력 처리를 막기 위해 어떤 조치도 취하지 않습니다.

+0

시스템이 sleep 쓰레드가 5 초 잠을 자고있는 동안, 시스템이 깨어나 자마자 실행을 계속할 것입니다. 예를 들어, 쓰레드가 3 초 동안 잠자다가 잠자기 상태가되었을 때, 잠자기 상태가되었을 때 2 초 더 잠을 자나요? – Richard

+0

아니요, 그 시점에서 수면 시간이 만료되었을 것입니다. –

+0

그 이유는 다음과 같은 이유로 나는 사실인지 모르겠습니다. 처음에는 잠자기 시간을 기록하기 전에 스레드가 최대 1 시간 동안 잠을 자도록했습니다. 내가 찾은 것은 몇 시간이 지나도 잠자기 시간이 기록되지 않는다는 것입니다. 그것은 나를 성공적으로 기록하기 위해 장치가 적어도 한 시간은 깨어 있어야한다고 생각하게 만들었습니다. 의미, 시간은 단순히 현실 세계 시간으로 갈 필요가 아니라 오히려 장치가 로깅되기 전에 할당 된 수면 시간에 성공적으로 도달하는 총 시간 동안 깨어 있어야했다. 말이 돼? – Richard

관련 문제