stopService не останавливает мой сервис .... почему? - PullRequest
23 голосов
/ 17 декабря 2010

У меня есть фоновая служба на моем Android-приложении, которая получает мое положение GPS и отправляет его на удаленную базу данных. Работает нормально.

Проблема в том, когда я хочу остановить службу .... она не останавливается: S. Также не возникло никаких исключений или ошибок в logcat ... он просто не останавливается.

это код для запуска моего сервиса (с кнопкой):

startService(new Intent(GPSLoc.this, MyService.class)); //enciendo el service

это код, где я его останавливаю (по методу onactivityresult):

stopService(new Intent(GPSLoc.this, MyService.class));

Я отлаживал приложение и проверял, что кодовая строка stopService вызывается каждый раз, когда я отлаживаю ее, но она не останавливается ......

Я уверен, что это не остановлено, потому что в моей базе данных я все еще получаю позиции GPS из эмулятора, когда нажимаю кнопку, чтобы остановить службу.

что я делаю плохо?

Ответы [ 10 ]

32 голосов
/ 17 декабря 2010

Вы реализовали onDestroy()?Если нет, то я считаю, что это может быть решением - и вы остановите свой Timer или все, что вы используете для запуска службы в onDestroy().

Службу можно остановить, вызвав ееметод stopSelf () или путем вызова Context.stopService ().

См. эту ссылку для получения дополнительной информации.

9 голосов
/ 17 декабря 2010

я уверен, что он не остановлен, потому что в моей базе данных я все еще получаю позиции GPS из эмулятора, когда нажимаю кнопку, чтобы остановить службу.ваш LocationListener.

4 голосов
/ 21 мая 2016

У меня была такая же проблема. Я обнаружил, что если служба подключена к 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));

     }
     ...
} 
2 голосов
/ 16 ноября 2014

Это очень распространенная ситуация, когда мне нужно остановить службу, прежде чем завершить процесс.В некоторых случаях недостаточно с 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, вы также остановите счетчик процесса.

public void stopService(){
        context.stopService(intent);
        LocalBroadcastManager.getInstance(context).unregisterReceiver(responseReceiver);
        responseReceiver = null;
        intent = null;
}

Берегите себя!@ Yaircarreno

1 голос
/ 09 февраля 2016

Если вы отслеживаете местоположение GPS, вы, вероятно, использовали GoogleApiClient.

Концепция заключается в том, что Сервис НЕ ОСТАНОВИТСЯ,

, если экземпляр GoogleApiClient все еще подключен к нему.

(или любая другая проблема, которую нужно сначала уничтожить / незарегистрировать)

Таким образом, чтобы все заработало, внедрите в свой сервис onDestroy():

@Override
public void onDestroy()
{
    // Unregistered or disconnect what you need to
    // For example: mGoogleApiClient.disconnect();
    super.onDestroy();
}
0 голосов
/ 05 апреля 2017

@ 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);

            }

        }

    }

}
0 голосов
/ 03 августа 2016

В моем случае stopService вызывается с startService почти одновременно, поэтому никакая служба не может быть остановлена. Попробуйте задержать stopService на несколько секунд. :)

0 голосов
/ 20 апреля 2016

Моя проблема решена путем удаления добавленных представлений в WindowManager ondestroy

public void onDestroy() {
    isRunning = false;
    super.onDestroy();
    if (checkBox!=null) {
        windowManager.removeView(getlayoutparm(fabsetting,fabrateus,fabexit,true)); 
        windowManager.removeView(checkBox); 
    }
 }
0 голосов
/ 02 мая 2013

Для тех, кто хочет периодически отправлять запрос на сервер, это моё решение. Вы должны иметь это в своей деятельности или деятельности фрагмента

{
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);
    }

}
0 голосов
/ 17 декабря 2010

Возможно, вы создаете новое намерение каждый раз, когда вызываете службу остановки.

stopService(new Intent(GPSLoc.this, MyService.class));

возможно, попробуйте:

Intent intnet = new Intent(GPSLoc.this, MyService.class); // create el service

startService(intenet); 
stopService(intent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...