运行 后台服务时的意外行为

Unexpected behaviour when running Service in background

在我的应用程序中,我有一项服务。它在主 activity 启动时启动并执行以下操作:

timer.scheduleAtFixedRate (
    new TimerTask() {
        public void run() {
            appendToFile("diff: "+(System.currentTimeMillis()-lastTime));
            lastTime = System.currentTimeMillis();
        }
    }, 0, 1);

基本上,它会创建一个 Timer,每毫秒更新一次。在每次更新时,计时器都会查看上次调用它的时间,并将计时器调用之间的时间保存到一个文件中。由于系统中总是存在开销,我希望每行输出超过 1 毫秒,可能在 10 毫秒左右。 这是应用程序休眠时的快照。

diff: 6
diff: 8
diff: 5
diff: 81
diff: 12
diff: 12
diff: 54
diff: 60
diff: 5734
diff: 77
diff: 9
diff: 20
diff: 6
diff: 21
diff: 10
diff: 13
diff: 16895
diff: 13
diff: 82
diff: 269
diff: 35
diff: 25
diff: 24
diff: 20
diff: 30
diff: 26
diff: 11
diff: 14
diff: 49
diff: 57
diff: 9

我的问题是关于我有时会得到的有些奇怪的结果。中间的 16895 表示该服务由于某种原因在系统空闲时等待了将近 17 秒 运行 它的任务。但是,紧接着它会在 10 到 30 毫秒之间显示更正常的结果。我知道这是在系统休眠期间,因为日志中有更多条目。该服务从未被破坏,因为我也记录了对 onDestroy() 的所有调用。

是否有解释为什么服务会突然暂停?有什么方法可以确保它一直 运行 吗?

就像你说的,系统正在休眠。当服务被取出内存时,服务是"destroyed"。休眠系统只是暂时的暂停,因为它会在 CPU 醒来后立即恢复。

您可以使用AlarmManager which will schedule an even to happen at a specific time. It'll wake the system up. You can also use a wake lock yourself or use a WakefulBroadcastReceiver唤醒系统以保持CPU运行。

请注意,保留 CPU 运行 会消耗大量电池电量,因此请谨慎使用,仅在绝对需要时使用。