Служба не останавливается при вызове метода stopService

В настоящее время у меня есть Служба, которая работает нормально, когда я ее запускаю, но когда я пытаюсь остановить ее, используя метод stopService, метод onDestroy не получает.

Вот код, который я использую, чтобы остановить службу

stop_Scan_Button = (кнопка) findViewById (R.id.stopScanButton);

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        Log.d("DEBUGSERVICE", "Stop Button pressed");
        Intent service = new Intent(CiceroEngine. CICERO_SERVICE);
        releaseBind();
        Log.d("Stop_Scan_Button", "Service: " + service.toString());
        stopService(service);
        Log.d("Stop_Scan_Button", "Service should stop! ");

        }   
});

Я правильно понимаю, что когда используется stopService, он вызывает метод onDestroy для Сервиса? Когда я нажимаю кнопку остановки сканирования, метод onDestroy() в моей службе не вызывается.

Есть ли что-нибудь еще, что мне не хватает, что я должен положить, чтобы остановить службу?

EDIT: для добавления onServiceConnected() вызывается при запуске stopService вместо onServiceDisconnected(), почему это происходит?

EDIT: Чтобы добавить дополнительную информацию о привязке

Я вызываю bindService в методе onCreate(), и затем у меня есть метод releaseBind(), отключающий службу.

Вот код для этого метода:

 public void releaseBind(){
    unbindService(this);
  }

Итак, я полагаю, что развязка не моя проблема?

Ответ 1

Я собираюсь предположить, что ваш вызов метода releaseBind() означает, что вы ранее вызывали bindService() в этой службе и что releaseBind() вызывает unbindService(). Если мое предположение неверно, пропустите этот ответ.


Служба отключится после того, как все вызовы bindService() имеют соответствующие вызовы unbindService(). Если нет связанных клиентов, то услуге также потребуется stopService(), если и только если кто-то вызвал startService() в службе.

Итак, здесь есть несколько возможностей:

  • У вас все еще есть связанные клиенты (например, другие действия), и в этом случае вы не можете остановить службу до тех пор, пока они не отвяжут
  • Поскольку оба unbindService() и stopService() являются асинхронными, что-то может сработать с учетом времени, и в этом случае вам может повезти, если вы вызываете stopService() из вашего метода ServiceConnection onServiceDisconnected()

Кроме того, имейте в виду, что точное время разрушения услуги до Android и может быть не сразу. Например, если вы полагаетесь на onDestroy(), чтобы заставить вашу службу прекратить какую-либо выполняемую работу, рассмотрите возможность использования для нее другого триггера (например, действия, вызывающие метод stopDoingStuff() через интерфейс связующего сервиса).

Ответ 2

Закрыты ли все ваши привязки?

Услуга может использоваться в двух способов. Эти два режима не полностью отдельный. Вы можете привязываться к сервису который был запущен с помощью startService(). Например, фоновая музыка услугу можно запустить, позвонив startService() с объектом Intent который определяет музыку для воспроизведения. Только позже, возможно, когда пользователь хочет контролировать игрока или получить информацию о текущая песня, будет заниматься установить соединение с услугой вызывая bindService(). В случаях например, stopService() не будет фактически остановите службу , пока последнее связывание закрыто

.

Ответ 3

Привет, ребята, жаль позднего ответа, но насколько я знаю, у меня есть успешная остановка службы в этом коде: вы можете проверить ссылку здесь.

public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
  Log.d(TAG, "onClick: starting srvice");
  startService(new Intent(this, MyService.class));
  break;
case R.id.buttonStop:
  Log.d(TAG, "onClick: stopping srvice");
  stopService(new Intent(this, MyService.class));
  break;
}
}

и в классе служб:

    public class MyService extends Service {
       private static final String TAG = "MyService";


@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");


}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");

}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");

}
}