我的活动通过致电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
而不是Timer。或者,如果我将服务foreground放在startForeground()
之后,或者可能单独process可以解决此问题,它也会有用。但我想知道为什么我的解决方案与充电一起工作。另外,我在哪里可以找到关于服务的这种“空闲”状态的信息。 (不执行计时器计划,但没有销毁)谢谢!
答案 0 :(得分:1)
如果您的服务必须在后台运行,则需要保留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
,因为保持服务一直运行会耗尽电池并浪费系统资源。