我创建了一个在前台运行的虚拟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
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();
}
}
答案 0 :(得分:2)
您提供的时间数据确实显示整个设备将进入睡眠状态。您拨打sleep()
的电话正在睡眠Service
的当前主题至少5秒钟。在这些类型的操作上,调度程序通常为+/- 10ms。如果没有唤醒锁,整个系统将会睡眠,这对您的服务生命周期没有任何影响。设备上的其他设备正在唤醒系统(可能是网络事件,警报,其他服务等),这反过来又导致您的应用程序在下次睡眠之前进行安排。您的服务是前台服务这一事实可以最大限度地降低因资源不足而导致服务被杀的风险,但不会阻止系统进行低功耗处理。