我正在阅读“开始Android 4开发”一书,我正在使用按钮中的以下功能来控制服务:
public void startService(View view) {
startService(new Intent(getBaseContext(), QOLService.class));
}
public void stopService(View view) {
stopService(new Intent(getBaseContext(), QOLService.class));
}
QOLService.java包含
public class QOLService extends Service {
int counter = 0;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Keep running service until stopped, so return sticky
Timer timer=new Timer();
TimerTask tt =new TimerTask() {
@Override
public void run() {
Log.d("QOLService", String.valueOf(++counter));
}
};
timer.scheduleAtFixedRate(tt, 0, 1000);
Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
}
按照预期,按下开始按钮我得到'service started'toast,在logcat中我得到一条消息每秒递增一次。即使应用程序关闭,这也会按预期继续。
当我点击停止服务按钮时,我也会得到预期的“服务已销毁”消息,但计时器依然存在!如果我关闭应用程序,它仍然继续。如果我再次单击stopservice按钮,它不会给出服务销毁消息,就像它第一次被成功销毁一样。
我不恰当地打电话给我的计时器吗?如果是这样的话,我似乎完全按照书中的建议去做!
答案 0 :(得分:7)
我是否不恰当地打电话给我的计时器?
你永远不会停止计时器。因此,它将一直运行,直到该过程终止。您应该在onDestroy()
。
答案 1 :(得分:4)
我同意CommonsWare,你没有在代码中停止你的计时器。我建议你这样走,
public class QOLService extends Service {
int counter = 0;
Timer timer;
TimerTask tt;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Keep running service until stopped, so return sticky
timer=new Timer();
tt =new TimerTask() {
@Override
public void run() {
Log.d("QOLService", String.valueOf(++counter));
}
};
timer.scheduleAtFixedRate(tt, 0, 1000);
Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
tt.cancel();
timer.cancel();
}
}
cancel()方法将停止你的Timer以及。
答案 2 :(得分:0)
可能是因为系统正在尝试重新启动您的服务,因为您要从START_STICKY
返回onStartCommand
。请尝试返回START_NOT_STICKY
。