StopService не останавливает мое обслуживание.... почему?
У меня есть справочная служба на моем андроидном APP, который получает мою позицию GPS и отправляет ее на удаленный db. Он отлично работает.
Проблема в том, когда я хочу остановить службу.... она не останавливается: S. Также не было никаких исключений или ошибок в logcat... он просто не останавливается.
это код для запуска моего srvice (с помощью кнопки):
startService(new Intent(GPSLoc.this, MyService.class)); //enciendo el service
это код, где я его останавливаю (по методу onactivityresult):
stopService(new Intent(GPSLoc.this, MyService.class));
Я отлаживал приложение, и я проверил, что кодовая строка stopService была вызвана каждый раз, когда я отлаживал ее, но она не останавливается...
Я уверен, что это не остановило причину в моей базе данных, я все еще получаю gps-позиции от эмулятора, когда я нажимаю кнопку, чтобы остановить службу.
что я делаю плохо?
Ответы
Ответ 1
Вы реализовали onDestroy()
? Если нет, я считаю, что это может быть решение - и вы остановите свой Timer
или все, что вы используете для запуска службы в onDestroy()
.
Службу можно остановить, вызвав метод stopSelf(), или вызвав Context.stopService().
Подробнее см. ссылку .
Ответ 2
Я уверен, что это не остановило причину в моей базе данных, я все еще получаю gps-позиции от эмулятора, когда я нажимаю кнопку, чтобы остановить службу.
Вероятно, вы не регистрируете свой LocationListener
.
Ответ 3
У меня была та же проблема. Я обнаружил, что если служба имеет GoogleApiClient
подключен и все еще получает обновление местоположения, stopService()
не имеет никакого эффекта, служба службы() не была вызвана.
Чтобы устранить проблему, я создал функцию, чтобы остановить службу определения местоположения в служебном коде. Вызовите stopLocationService()
из действия, а затем вызовите stopService. Вот пример кода:
public class myLocationService extends Service{
...
public void stopLocationUpdates() {
LocationService.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
mGoogleApiClient.disconnect();
}
...
}
В действии
{
...
if(mService != null && isBound) {
mService.stopLocationUpdates();
doUnbindService();
stopService(new Intent(this, myLocationService.class));
}
...
}
Ответ 4
Это очень распространенная ситуация, когда мне нужно прекратить мое обслуживание, прежде чем завершить процесс. В некоторых случаях недостаточно с stopService (намерение). Вы должны иметь в виду реализацию onDestroy() в моей службе. Пример:
public class MyIntentService extends IntentService {
// Defines and instantiates an object for handling status updates.
private BroadcastNotifier mBroadcaster = null;
private int progress = 0; //THIS IS MY COUNTER FOR EXAMPLE!!!
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
progress = 0;
int tiempo_disponible = intent.getIntExtra("minutos_disponible", 0);
if (mBroadcaster == null){
mBroadcaster = new BroadcastNotifier(this);
}
// Broadcasts an Intent indicating that processing has started.
mBroadcaster.broadcastIntentWithState(Constants.STATE_ACTION_STARTED);
mBroadcaster.broadcastIntentWithState(Constants.STATE_ACTION_RUNNING);
while (progress < tiempo_disponible) {
progress++;
try {
Log.i(Constants.TAG, "Procesing " + progress);
mBroadcaster.notifyProgress(progress);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Reports that the feed retrieval is complete.
mBroadcaster.broadcastIntentWithState(Constants.STATE_ACTION_COMPLETE);
}
@Override
public void onDestroy() {
progress = 1000000; // WHITH THAT YOU FINISH THE CICLE IF tiempo_disponible NEVER IS MAYOR THAT 1000000, YOU CAN USE OTHER CONDITIONAL!!!!!!
super.onDestroy();
}
}
Таким образом, когда вы остановили службу, используя метод stopService, вы также остановите счетчик o.
public void stopService(){
context.stopService(intent);
LocalBroadcastManager.getInstance(context).unregisterReceiver(responseReceiver);
responseReceiver = null;
intent = null;
}
Позаботьтесь!
@yaircarreno
Ответ 5
Если вы отслеживаете местоположение GPS, вы, вероятно, использовали GoogleApiClient
.
Концепция заключается в том, что служба НЕ останавливается,
если в нем все еще подключен экземпляр GoogleApiClient
.
(Или любая другая проблема, которая должна быть сначала уничтожена/незарегистрирована)
Итак, чтобы он работал, реализуйте onDestroy()
в своем сервисе:
@Override
public void onDestroy()
{
// Unregistered or disconnect what you need to
// For example: mGoogleApiClient.disconnect();
super.onDestroy();
}
Ответ 6
возможно, что вы создаете новый Intent каждый раз, когда вы вызываете стоп-сервис.
stopService(new Intent(GPSLoc.this, MyService.class));
возможно, попробуйте:
Intent intnet = new Intent(GPSLoc.this, MyService.class); // create el service
startService(intenet);
stopService(intent);
Ответ 7
Для тех, кто хочет периодически отправлять запрос на сервер, это мое решение. Вы должны иметь это в своей деятельности или работе с фрагментами.
{
private static final Long UPDATE_LOCATION_TIME = 30 * 60 * 1000l; // 30 minute
private AlarmManager alarm;
private PendingIntent pIntent;
...
@Override
protected void onResume() {
super.onResume();
// Run background service in order to update users location
startUserLocationService();
Log.e(TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
stopUserLocationService();
Log.e(TAG, "onStop");
}
private void startUserLocationService() {
Log.i(TAG, "Starting service...");
Intent intent = new Intent(MainFragmentHolder.this, ServiceUserLocation.class);
pIntent = PendingIntent.getService(this, 0, intent, 0);
alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), UPDATE_LOCATION_TIME, pIntent);
}
private void stopUserLocationService() {
alarm.cancel(pIntent);
Intent intent = new Intent(MainFragmentHolder.this, ServiceUserLocation.class);
stopService(intent);
}
}
Ответ 8
моя проблема решена путем удаления добавленных представлений до WindowManager
ondestroy
public void onDestroy() {
isRunning = false;
super.onDestroy();
if (checkBox!=null) {
windowManager.removeView(getlayoutparm(fabsetting,fabrateus,fabexit,true));
windowManager.removeView(checkBox);
}
}
Ответ 9
В моем случае stopService
вызывается с startService
почти одновременно, поэтому никакая служба не должна останавливаться. Попробуйте задержать stopService
в течение нескольких секунд.:)
Ответ 10
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
if (mLocationManager != null) {
for (int i = 0; i < mLocationListeners.length; i++) {
try {
mLocationManager.removeUpdates(mLocationListeners[i]);
} catch (Exception ex) {
Log.d(TAG, "fail to remove location listners, ignore", ex);
}
}
}
}
Ответ 11
Я нашел лучший способ остановить службу, чтобы остановить себя. Таким образом, вы уверены, что он действительно остановит и сохранит целостность данных. Если вы хотите сделать это извне (активность), я обычно использую глобальный статический атрибут.
По примеру (Kotlin), если у меня есть MyService
, MyActivity
и MyObject
Мой объект
object MyObject{
abort = false
}
MyService
override fun onHandleIntent(intent: Intent?) {
startForeground(id,notification)
for (i in range){
if (MyObject.abort) break
// RUN SOME CODE HERE
}
stopForeground(true)
stopSelf()
}
MyActivity
fun startService() {
startForegroundService(Intent(this, OptimizationService::class.java))
}
fun stopService() {
MyObject.abort = true
}