如何杀死前台服务

Posted

技术标签:

【中文标题】如何杀死前台服务【英文标题】:How to kill a foregound service 【发布时间】:2014-04-28 13:30:02 【问题描述】:

我正在开发一个需要使用前台服务的应用。该服务正常工作,但我无法杀死它。首先,我尝试使用 stopService 杀死,然后我看到一个话题,人们说使用 startService 和一个额外的作为杀死服务的键:

在我的活动中:

Intent i = new Intent(this, MyService.class);
i.putBooleanExtra("killService",true);

在我的服务的 onStartCommand 中:

if(intent.getBooleanExtra("killService",false))

    stopForeground(true);
    stopSelf();
 ....

我想在用户按下我的活动的特定按钮时停止服务:

public void onClick(View v)

    switch(v.getId)
    
       case R.id.myButton:
       (here i want to kill the service)
       break;
       ...

【问题讨论】:

您可能需要注意这样一个事实,即通知 android 您不再需要某些东西与实际杀死之间存在差异它的进程 - 在 99% 的情况下,您不应该尝试这样做,而是让 Android 决定是否/何时需要重用进程持有的资源。跨度> 对不起,我不想终止服务,但我想停止它并确保调用 onDestroy 【参考方案1】:

如果您的服务不打算“绑定”到您的任何客户端,那么显式的 stopService(Intent) 调用就足以杀死您的服务

如果您的服务用于绑定,并且您已通过调用 bindService(Intent, ServiceConnection, int) 成功绑定到服务,则必须从绑定的客户端调用 unbindService(..)

如果您的服务同时支持绑定和启动,则必须使用混合方法来停止它。

    绑定服务:要停止以前的bound 服务,您必须取消绑定之前绑定服务的所有客户端

    启动的服务:要停止以startService(Intent) 启动的服务,您必须调用stopService(Intent)。就够了,不需要用任何命令启动它。

    混合(绑定和启动)服务:您必须显式调用 stopService(Intent) 并取消绑定所有客户端。只有当您的所有客户端都未绑定服务并且已调用 stopService(Intent) 时,服务才会真正停止。

如果你不确定你有什么样的服务,阅读Services guide,那里的解释是令人满意的。

【讨论】:

我的服务没有绑定但是stopService不起作用 显示代码的相关部分,您尝试在其中停止服务 你怎么理解你的服务没有被杀死?你如何开始服务?停止服务的Intent 是什么? 我知道我的服务没有被杀死,因为没有调用 onDestroy 然后再次调查您的代码。 stopService 根本不可能停止服务。如果是这样,您肯定在某处使用绑定,完全不知道这一事实。确保在服务的onBind() 中返回null(因为它不用于绑定)。 当然,请确保您的侦听器按预期工作,也就是说,它会触发 stopService(..) 代码【参考方案2】:

我的错误,onDestroy 被调用,但我无法看到它...

【讨论】:

以上是关于如何杀死前台服务的主要内容,如果未能解决你的问题,请参考以下文章

不在前台时位置服务被杀死

前台服务在执行互联网相关操作时被杀死

如何确认服务是前台服务

Android 前台服务

Android,前台服务让app保持活力吗?

前台服务与 PARTIAL_WAKE_LOCK 的关系