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



我已经制作了一个Intent服务,它正在按预期工作,我知道Intent服务会工作并在工作后自行停止,所以没有必要停止它。我制作了我的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);

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

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

请告诉我怎样才能做到这一点。

为了做到这一点,您必须进一步修改从IntentService派生的自定义DownloadServiceIntentService基类自动启动一个线程并在那里为Intent提供服务,当它没有更多的工作要做时关闭线程和服务

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

  2. 或者,您可以添加自己的onBind()实现,并使Activity与服务绑定。然后公开一个绑定器方法(请参阅AIDL上的文档),以便在您想要退出服务时由Activity调用。和上面一样,您的服务的onHandleIntent()需要注意这个早期退出类型标志,并导致其过早停止。

请注意,在任何一种情况下,服务的进程都很可能不会被终止,这是正常的。Android保持进程缓存并处于就绪状态,因此当启动其组件的新请求到达时,它会非常响应。这并不意味着您的服务正在"运行"。这只是意味着承载服务的流程已经创建并准备就绪。

最新更新