Я создал манекен 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();
}
}