我的 Activity 通过调用启动服务startservice()
。为了简化我的问题,假设该服务将是一个计数器,并且计数器将每 10 秒增加一次。
Timer t_counter;
int counter = 0;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
t_counter = new Timer();
t_counter.schedule(new TimerTask() {
@Override
public void run() {
counter++;
Log.d("counter: ",Integer.toString(counter));
}}, 0, 10000);
return Service.START_STICKY;
}
当手机正在充电时(或处于调试模式 - 因为我可以看到Logcat
) 服务按预期工作。大约每 10 秒一次Logcat
无论应用程序是否处于后台,都会显示调试信息。但是当我拔掉电话后,该服务会在一段时间后停止运行。当应用程序(启动服务的活动)处于活动状态时发生的事件。请注意,服务并未被破坏,只是被搁置,或者类似的事情。
因为当我再次插入手机时,计时器会继续计时,并且计数器的值会从我刚刚拔下手机时的值开始增加。因此,如果服务被破坏,那么价值将再次为零。 (我还调试服务的生命周期,但看不到onStartCOmmand()
, onDestroy()
会被称为)
我已经找到了它的解决方案,但我认为我还没有得到这种行为的正确答案。
我知道我应该使用AlarmManager而不是计时器。或者如果我把服务放在前景 by startForeground()
,或者也许分开process会解决这个问题。但我想知道为什么我的解决方案可以充电。另外,我在哪里可以找到有关服务的“空闲”状态的信息。 (不执行计时器计划,但没有销毁)谢谢!
你需要握住lock
如果您的服务必须在后台运行
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl =
pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
// when you done
wl.release();
更好的方法是使用AlarmManager
因为让服务一直运行会耗尽电池并浪费系统资源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)