I am developping a wear app.
I start a sticky service in the wear when I receive a dedicated event.
This service returns START_STICKY in onStartCommand.
My question is : how can I stop definitively this service?
I need it to be restarted if Android stops it because of low memory, but I need to be able to stop it definitively by code.
I tried to stop it using stopService(Intent i) or stopSelf() but the service gets recreated each time.
Thank you for your help.
jn.
Call stopService(intentOfYourService) at onPause() or onDestroy() and give the Intent you created at onCreate() (or elsewhere) to the parameteres.
my question is simply about how do we restart an android service that runs in background in it's own thread from an activity if the service stops itself after completing certain tasks.
Simply call startService() from your activity:
http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)
Make sure you are extending Service, not IntentService. And then start service in STICKY mode. It should remain active that way. Even if it dies for some reason (system may kill it etc.), it should restart on its own.
Read this link: START_STICKY and START_NOT_STICKY
I am looking at the doc but it doesn't really explain this anywhere. I did find this:
The service will at this point continue running until Context.stopService()
or stopSelf() is called.
What this tells me is the Service will continue running, but that is assuming when orientation change occurs that the Activity/Fragment does not automatically stop services it has started. I also found this:
Using startService() overrides the default service lifetime that is managed by
bindService(Intent, ServiceConnection, int): it requires the service to remain
running until stopService(Intent) is called, regardless of whether any
clients are connected to it.
Can I assume that the Service will actually not stop until I explicitly call stopService?
for the title, answer is no.
A service doesn't stops when the calling activity/fragment changes orientation. It continues running unless or untill it is stopped explicitly
for the description, the answer is yes.
you definitely need to call either of the functions stopService() or stopSelf() to stop the service.
Yes.You have to stop it using stopService() method or you can use stopSelf() to stop when the the service is no longer needed.it will automatically stop the service.
Googling around, I have seen this problem posted many times, some of the posts on this forum over that last few years. I have never seen anyone get a straight answer.
I have a foreground service that tries to stop itself after running for 2 hours by doing a this.StopSelf(). I've tried it when it's bound and when it's unbound. On the AVD and on a device.
It simply does not work. Is this a bug in Android? (running 2.3.3).
How can a service stop itself?
If you use a foreground service, you should call:
stopForeground(true);
Just like you start it with startForeground.
stopSelf is meant to be used for normal services. a foreground service is special... :)
By the way, in case your app should work on older devices, you should check the compatibility code offered here.
The only way I have found to stop a service with certainty is to use:
android.os.Process.killProcess(android.os.Process.myPid());
This behavior can be caused by using worker threads that have not finished when the stopSelf is called. If you are using worker threads, be careful how you employ this - you may leak memory if you don't clean up before executing the line.
I met a similar problem.Through my search found that: In other activity's onCreate method I bind the service,but not unbind it onDestory method.After fix that,when I call stopSelf then the service's onDestory method is call. I hope it can help you.
At same time,I find base from Android gover document.
A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy().
I had this problem and searching I found this thread. My app's problem is that when service calls stopSelf(), the foreground activity that binds the service is still running. Thne stopSelf is called but the service is not destroyed as the foreground activity is still bound. When I leave the activity by pressing back or going to home screen, then the service is destroyed. In short, stopSelf won't work when a foreground activity is bound.
I encounter this issue of selfStop() that not working too.
The main idea to understand is that the Service WILL NOT stop,
if a running loop is still running (while(mDoWhile) for example).
Or any other issue that need to be destroyed / unregistered first.
So to make the stopSelf() or stopService(intent) works,
implement onDestroy() within your service:
#Override
public void onDestroy()
{
// Unregistered or disconnect what you need to
// For example: mGoogleApiClient.disconnect();
// Or break the while loop condition
// mDoWhile = false;
super.onDestroy();
}
if you both called startService and bindService.you should unbindService frist,otherwish the stopSelf will not work.
I was facing same problem too.
As we all know that Service runs on App's UI Thread. So, until you've Thread that is running in background in your service and you are calling stopSelf() then it won't work. For that you have to stop that Thread first and then execute stopSelf().
After stoping all background Thread from your Service stopSelf() method will definitely work.
The only way i had to kill the foreground service was to set stopwithtask=true in the manifest
<service
android:name="my.package.MyForegroundService"
android:foregroundServiceType="location"
android:stopWithTask="true"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
</service>
In my case of foreground service, it was necessary to remove location updates, unregister sensors, etc.
Add the following code to OnStartCommand when you want to kill the service:
private void selfTerminate() {
stopForeground(true);
unregisterBarometer();
if (locCallBack != null) {
getFusedLocationProviderClient(this).removeLocationUpdates(locCallBack);
}
m_tripState.currentActivity.clock.stopClock();
stopSelf();
}
stopSelf might not destroy the service if the conditions are not favorable, but you can stopService with the application context. But make sure the service doesn't restart before calling stopService inside service.
stopService(applicationContext, MyService::class.java)
I have a service in my application but this service stop working after time and i want to keep the service keep working without stopping and for that i try to start the same service from onDestroy method when it dieing but its not work even the written log not appear ,so it is possible to call the service from itself and if it not may i create another service who do the same work and they call each other when one of them stopped, so when in onDestory i cant call it so how to call it?, wish that someone can help me with this situation thnx on advance
You should not try to start the service again yourself. Better return START_STICKY or START_REDELIVER_INTENT from onStartCommand() and the system will do it for you when it has enough resources.
See the following link where there is also an example.
http://developer.android.com/guide/components/services.html