如何停止从活动在另一个进程中启动的意向服务

时间:2015-11-13 13:54:42

标签: android intentservice

我已经提供了一个Intent服务,并且按预期工作,而且我知道意图服务可以正常工作并在工作后自行停止,所以不需要停止它。我已经制作了我的意向服务,因为你可以谷歌它,但我已经在一个单独的过程中启动它。代码在xml

中是这样的
android:process=":MYPROCESS"

所以在我的应用程序中,我按下按钮点击

按以下方式启动意向服务
Intent intent = new Intent(DownloadService.ALARM_SERVICE);
    intent.setClass(this,DownloadService.class);

    /* Send optional extras to Download IntentService */
    intent.putExtra("url", "http://myurl.com");
    intent.putExtra("receiver", mReceiver);
    intent.putExtra("requestId", 101);

    startService(intent);

这只是为了让你了解我是如何开始的,这是正常的。

发生了什么

我已经制作了一个按钮来停止服务,我的这项服务正在下载一些东西。所以我做了什么,我杀了这个过程,但是再次开始服务。

因为我希望我的服务在被系统杀死或应用程序被杀时再次启动所以我设置了重新启动的意图,如下所示

setIntentRedelivery(true);

所以这是一个惊人的情况:所以简化我的问题如下

我想停止服务以免再次启动,但是当它被系统杀死或者当用户从最近的应用程序中删除应用程序时它被杀死,那么服务应该重新开始(这很好)。

请告诉我如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

要执行此操作,您必须进一步修改源自DownloadService的自定义IntentServiceIntentService基类会自动启动一个线程并为那里的Intent提供服务,当没有更多的工作要做时,关闭线程和服务。您有2个选择可用于停止服务:

  1. 在您的服务中实现onStop()并让它设置内部(同步)shutdown布尔值。在onHandleIntent()中,您可以检查此标记并提前退出处理程序,并可能调用stopSelf()以提前退出。

  2. 或者,您可以添加自己的onBind()实施,并将Activity与服务绑定。然后公开当您要退出服务时由Activity调用的绑定器方法(请参阅AIDL上的文档)。如上所述,您的服务onHandleIntent()需要关注此早退式标记并导致其过早停止。

  3. 请注意,在任何一种情况下,服务的过程很可能都不会被杀死,这是正常的。 Android将进程缓存并处于准备状态,以便在启动其组件的新请求到达时响应迅速。这意味着您的服务是"正在运行"。它只是意味着已经创建了主持服务的过程并准备就绪。