I have an IntentService that is started from an Activity and I would like to be able to stop the service immediately from the activity with a "cancel" button in the activity. As soon as that "cancel" button is pressed, I want the service to stop executing lines of code.
I've found a number of questions similar to this (i.e. here, here, here, here), but no good answers. Activity.stopService()
and Service.stopSelf()
execute the Service.onDestroy()
method immediately but then let the code in onHandleIntent()
finish all the way through before destroying the service.
Since there is apparently no guaranteed way to terminate the service's thread immediately, the only recommended solution I can find (here) is to have a boolean member variable in the service that can be switched in the onDestroy()
method, and then have just about every line of the code in onHandleIntent()
wrapped in its own "if" clause looking at that variable. That's an awful way to write code.
Does anybody know of a better way to do this in an IntentService?
Here is the trick, make use of a volatile static variable and check continue condition in some of lines in your service that service continue should be checked:
and in your activity do this to stop your service,
Here is some sample code to start/stop Service
To start,
To stop,
context.stopService(GPSService);
Hope it works.
In case of IntentService it does not stop or takes any other request through some intent action until its
onHandleIntent
method completes the previous request.If we try to start IntentService again with some other action,
onHandleIntent
will be called only when previous intent / task is finished.Also
stopService(intent);
orstopSelf();
does not work until theonHandleIntent()
method finishes its task.So I think here better solution is to use normal
Service
here.I hope it will help!
Stopping a thread or a process immediately is often a dirty thing. However, it should be fine if your service is stateless.
Declare the service as a separate process in the manifest:
And when you want to stop its execution, just kill that process: