20

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

我有一个前台服务,它在运行 2 小时后尝试通过执行 this.StopSelf() 自行停止。我在绑定和未绑定时都试过了。在 AVD 和设备上。

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

服务如何自行停止?

4

9 回答 9

29

如果你使用前台服务,你应该调用:

stopForeground(true);

就像你开始它一样startForeground

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

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

于 2013-08-26T18:45:40.180 回答
11

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

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

此行为可能是由于使用调用时尚未完成的工作线程造成的stopSelf。如果您正在使用工作线程,请注意如何使用它 - 如果您在执行该行之前不清理,您可能会泄漏内存。

于 2013-08-26T18:38:43.390 回答
11

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

同时,我从Android gover文档中找到了base。

服务既可以启动,也可以绑定连接。在这种情况下,只要服务已启动或有一个或多个使用 Context.BIND_AUTO_CREATE 标志的连接,系统就会保持服务运行。一旦这两种情况都不成立,就会调用服务的 onDestroy() 方法并有效地终止服务。从 onDestroy() 返回时,所有清理(停止线程、注销接收器)都应该完成。

于 2016-09-29T05:54:00.647 回答
3

我有这个问题,搜索我找到了这个线程。我的应用程序的问题是,当服务调用 stopSelf() 时,绑定服务的前台活动仍在运行。调用了 stopSelf 但服务没有被破坏,因为前台活动仍然被绑定。当我通过按返回或转到主屏幕离开活动时,服务将被破坏。简而言之,当绑定前台活动时,stopSelf 将不起作用。

于 2015-06-01T04:34:56.887 回答
3

我也遇到了这个问题selfStop()

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

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

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

所以要制作stopSelf()orstopService(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();
}
于 2016-02-08T21:27:21.423 回答
0

我也面临同样的问题。

众所周知,它Service运行在 App 的UI Thread. 因此,除非您Thread在服务的后台运行并且您正在调用stopSelf()它,否则它将无法正常工作。为此,您必须先停止该操作Thread,然后再执行stopSelf().

Thread从您的Service stopSelf()方法中停止所有背景后,肯定会起作用。

于 2015-05-05T10:50:10.187 回答
0

我必须杀死前台服务的唯一方法是在清单中设置 stopwithtask=true

    <service
        android:name="my.package.MyForegroundService"
        android:foregroundServiceType="location"
        android:stopWithTask="true"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    </service>
于 2021-02-04T14:00:01.070 回答
0

如果你同时调用了 startService 和 bindService。你应该首先取消绑定服务,否则 stopSelf 将不起作用。

于 2019-10-22T01:03:01.217 回答
-1

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

stopService(applicationContext, MyService::class.java)
于 2019-05-22T23:02:25.313 回答