Почему мой IntentService не требует WakeLock?

Я создал манекен IntentService, который работает на переднем плане и, по сути, просто регистрирует, как долго он не спит каждые 5 секунд. Это выполнялось в течение нескольких часов на тестовом устройстве без каких-либо разрешений WakeLock. Кроме того, похоже, что это совсем не влияет на время автономной работы. Не отображается как использование даже 1% батареи в статистике батареи на устройстве. Как эта служба может работать постоянно, не требуя 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

ИнтентСервис:

@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();
    }

}

person Dick Lucas    schedule 01.12.2014    source источник
comment
некоторое связанное объяснение и будильники работают, пока устройство находится в спящем режиме">android.stackexchange.com/questions/69693/   -  person zapl    schedule 02.12.2014


Ответы (1)


Предоставленные вами временные данные действительно показывают, что устройство в целом переходит в спящий режим. Ваш вызов sleep() приостанавливает текущий поток вашего Service как минимум на 5 секунд. Планировщик обычно +/- 10 мс на эти типы операций. Без wakelock система в целом будет спать, и это не повлияет на жизненный цикл вашего сервиса. Что-то еще на устройстве пробуждает систему (могут быть сетевые события, сигналы тревоги, другие службы и т. д.), что, в свою очередь, заставляет ваше приложение планироваться до следующего сна. Тот факт, что ваша служба является приоритетной, сводит к минимуму риск ее уничтожения из-за нехватки ресурсов, но ничего не делает для предотвращения работы системы с низким энергопотреблением.

person Larry Schiefer    schedule 02.12.2014
comment
Если система переходит в спящий режим, когда мой поток находится в середине 5-секундного спящего режима, продолжается ли выполнение с того места, где оно было остановлено, как только система просыпается. Например, если мой поток спал 3 секунды, то устройство уходит в сон, когда проснется, будет ли оно спать еще 2 секунды? - person Dick Lucas; 08.12.2014
comment
Не знаю, правда ли это, по следующей причине. Первоначально мой поток спал до часа, прежде чем он регистрировал время сна. Я обнаружил, что даже через несколько часов время сна никогда не регистрируется. Это заставило меня подумать, что устройство должно находиться в активном состоянии не менее часа, чтобы оно успешно зарегистрировалось. Это означает, что в реальном времени должен был пройти не только час, но и устройство должно было находиться в активном состоянии в течение часа, чтобы успешно достичь отведенного времени сна перед записью. Имеет ли это смысл? - person Dick Lucas; 08.12.2014