如何杀死前台服务
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 被调用,但我无法看到它...
【讨论】:
以上是关于如何杀死前台服务的主要内容,如果未能解决你的问题,请参考以下文章