我无法停止简单的服务

时间:2019-12-02 16:02:08

标签: android service destroy

我知道已经问过这个问题,但是我找到的解决方案并不能解决问题,至少对我来说。

我有一项简单的服务,我会在某个时间致电某个活动。该服务每三秒钟执行一次操作。 该服务运行良好,但是在阅读了很多有关该主题的内容并尝试了我发现的所有解决方案之后,我无法销毁并停止该服务。 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
                    }

                }

            });
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果“ Service onDestroy”打印到logcat,则您的Service实际上已经停止。这并不意味着您的Timer已停止。

Android框架无法知道与您的Service关联的线程,因此,在决定销毁Service时,它不会杀死任何特定线程。即使Service对象本身是GC的,也是如此。 (尽管已实现,但您的myService对象将不会被GC,因为通过Timer线程和该TimeDisplayTimerTask中的Timer有多个对其的引用。 )

在您命令Timer停止几分钟后,您可能会发现Service最终停止运行;这可能是因为Android完全终止了您的应用程序,以便为优先级更高的应用程序和/或“前景”应用程序释放资源。

要改善这种情况,您应该在purge()Timer onDestroy()