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
}