2014-12-01 3 views
1

Я создал манекен 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 секунд. Планировщик обычно составляет +/- 10 мс при этих типах операций. Без wakelock система в целом будет спать, и это не повлияет на ваш жизненный цикл службы. Что-то еще на устройстве пробуждает систему (могут быть сетевые события, сигналы тревоги, другие сервисы и т. Д.). Это, в свою очередь, заставляет ваше приложение планироваться до следующего сна. Тот факт, что ваш сервис является приоритетным, сводит к минимуму риск его гибели из-за низких ресурсов, но не делает ничего, чтобы предотвратить низкую энергопотребление системы.

+0

Если система уходит спать, когда мой нить находится в середине его 5-секундного сна, выполняется ли выполнение, где оно остановилось, как только система просыпается. Например, если мой поток спал в течение 3 секунд, устройство перестает спать, когда он просыпается, он будет спать еще на 2 секунды? – Richard

+0

Нет, в этот момент время сна истекло. –

+0

Я не знаю, верно ли это по следующей причине. Первоначально у меня была своя нить до часа, прежде чем она записывала время сна. Я обнаружил, что даже через несколько часов время сна никогда не будет регистрироваться. Это заставило меня подумать, что устройство должно просыпаться, по крайней мере, на час, чтобы он мог успешно войти в систему. Смысл, час не просто должен был пройти в реальном мире, но устройство должно было пробудиться в течение часа, чтобы успешно достичь отведенного времени сна до входа в систему. Имеет ли это смысл? – Richard

Смежные вопросы