我不能停止一个简单的服务
I can't stop a simple service
我知道这个问题已经被问过了,但我找到的解决方案并没有解决问题,至少对我来说是这样。
我有一个简单的服务,我在特定时间从 activity 调用。该服务每三秒执行一次操作。
该服务运行良好,但在阅读了很多有关该主题的内容并尝试了我找到的所有解决方案之后,我无法破坏该服务并停止它。 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
关联,因此当它决定销毁您的 [=10] 时,它不会擅自杀死任何特定线程=].即使 Service
对象本身是 GC 也是如此。 (尽管如此,您的 myService
对象不会被 GC,因为通过 Timer
线程和 Timer
中的 TimeDisplayTimerTask
有多个对它的引用。 )
您可能会发现 Timer
最终会停止 运行,在您命令 Service
停止几分钟后;这可能是因为 Android 已完全终止您的应用程序,以便为更高优先级的应用程序释放资源,and/or "foreground" 应用程序。
要改善这种情况,您应该在 onDestroy()
中 purge()
您的 Timer
。
我知道这个问题已经被问过了,但我找到的解决方案并没有解决问题,至少对我来说是这样。
我有一个简单的服务,我在特定时间从 activity 调用。该服务每三秒执行一次操作。 该服务运行良好,但在阅读了很多有关该主题的内容并尝试了我找到的所有解决方案之后,我无法破坏该服务并停止它。 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
关联,因此当它决定销毁您的 [=10] 时,它不会擅自杀死任何特定线程=].即使 Service
对象本身是 GC 也是如此。 (尽管如此,您的 myService
对象不会被 GC,因为通过 Timer
线程和 Timer
中的 TimeDisplayTimerTask
有多个对它的引用。 )
您可能会发现 Timer
最终会停止 运行,在您命令 Service
停止几分钟后;这可能是因为 Android 已完全终止您的应用程序,以便为更高优先级的应用程序释放资源,and/or "foreground" 应用程序。
要改善这种情况,您应该在 onDestroy()
中 purge()
您的 Timer
。