我知道已经问过这个问题,但是我发现的解决方案并不能解决问题,至少对我而言。
我有一项简单的服务,我会在某个时间致电某个活动。该服务每三秒钟执行一次操作。该服务运行良好,但是在阅读了很多有关该主题的内容并尝试了我发现的所有解决方案之后,我无法销毁并停止该服务。 onStartCommand方法总是再次运行,我重新开始。
有人可以告诉我我必须在代码中进行的更改以完全停止服务并销毁它吗?
我坚持,stopSelf(),stopService()等,等等……该服务从未停止过
非常感谢,我留下了我的代码:
public class myService extends Service {
//...
@Override
public void onCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (mTimer != null) {
} else {
mTimer = new Timer();
}
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onDestroy() {
Log.e(TAG,"Service onDestroy");
}
class TimeDisplayTimerTask extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
vuelta = vuelta +1;
if (vuelta==2){
stopSelf();
} else {
// NA
}
}
});
}
}
}
如果“ Service onDestroy”打印到logcat,则您的Service
实际上已经停止。这并不意味着您的Timer
已停止。
Android框架无法知道哪些线程与您的Service
关联,因此,在决定销毁Service
时,它不会杀死任何特定线程。即使Service
对象本身是GC'd,也是如此。 (尽管已实现,但您的myService
对象将不会进行GC处理,因为通过Timer
线程和该TimeDisplayTimerTask
中的Timer
有多个对其的引用。)
[您可能会在命令Timer
停止几分钟后发现Service
最终停止运行;这可能是因为Android完全终止了您的应用程序,以便为优先级更高的应用程序和/或“前景”应用程序释放资源。
为了改善这种情况,您应该在purge()
中将Timer
设置为onDestroy()
。