StopSelf不会停止我的服务

时间:2012-12-04 23:10:51

标签: android service

谷歌搜索,我已经看过很多次这个问题了,过去几年这个论坛的一些帖子。我从未见过有人得到直接答案。

我有一个前台服务,它通过执行this.StopSelf()运行2小时后试图阻止自己。我已经尝试过了,当它被束缚时,它还没有被束缚。在AVD和设备上。

它根本不起作用。这是Android中的错误吗? (运行2.3.3)。

服务如何自行停止?

9 个答案:

答案 0 :(得分:21)

如果您使用前台服务,则应致电:

stopForeground(true);

就像你用startForeground开始一样。

stopSelf旨在用于普通服务。前台服务很特别......:)

顺便说一下,如果您的应用应该在较旧的设备上运行,您应该检查提供的兼容性代码here

答案 1 :(得分:10)

我发现确定停止服务的唯一方法是使用:

android.os.Process.killProcess(android.os.Process.myPid());

使用在调用stopSelf时尚未完成的工作线程可能会导致此行为。如果您正在使用工作线程,小心如何使用它 - 如果在执行该行之前没有清理,则可能会泄漏内存。

答案 2 :(得分:7)

我遇到了类似的问题。通过我的搜索发现:在其他活动的onCreate方法中我绑定了服务,但没有取消绑定它onDestory方法。修复后,当我调用stopSelf然后服务的onDestory方法是调用。我希望它可以帮到你。

同时,我从Android管理文档中找到了基础。

  

A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy().

答案 3 :(得分:3)

我有这个问题并且搜索我找到了这个帖子。我的应用程序的问题是,当服务调用stopSelf()时,绑定服务的前台活动仍在运行。调用stopSelf,但由于前台活动仍然受约束,服务不会被破坏。当我通过按回或进入主屏幕离开活动时,服务将被销毁。简而言之,当绑定前景活动时,stopSelf将不起作用。

答案 4 :(得分:3)

我遇到selfStop()这个问题也没有用。

理解的主要理念是服务不会停止,

如果正在运行的循环仍在运行(例如while(mDoWhile))。

或者首先需要销毁/取消注册的任何其他问题。

所以要使stopSelf()stopService(intent)有效,

在您的服务中实施onDestroy()

@Override
public void onDestroy()
{
    // Unregistered or disconnect what you need to
    // For example: mGoogleApiClient.disconnect();

    // Or break the while loop condition
    // mDoWhile = false;

    super.onDestroy();
}

答案 5 :(得分:0)

我也遇到了同样的问题。

众所周知,Service在应用UI Thread上运行。因此,在您的服务后台运行Thread并且正在调用stopSelf()之前,它将无效。为此,您必须先停止Thread,然后执行stopSelf()

停止使用Thread Service方法中的所有后台stopSelf()肯定会有效。

答案 6 :(得分:0)

如果条件不利,

stopSelf可能不会破坏服务,但是您可以stopService使用应用程序上下文。但是请确保在调用服务内部的stopService之前服务不会重新启动。

stopService(applicationContext, MyService::class.java)

答案 7 :(得分:0)

如果您同时调用了startService和bindService。则应先取消绑定Service,否则stopSelf将无法正常工作。

答案 8 :(得分:0)

我不得不终止前台服务的唯一方法是在清单中设置 stopwithtask=true

    <service
        android:name="my.package.MyForegroundService"
        android:foregroundServiceType="location"
        android:stopWithTask="true"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    </service>