Служба не остановится при вызове метода stopService - PullRequest
25 голосов
/ 01 февраля 2010

У меня есть служба, которая работает нормально при запуске, но когда я пытаюсь остановить ее с помощью метода 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() в моей службе не вызывается.

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

РЕДАКТИРОВАТЬ: для добавления onServiceConnected() вызывается при запуске stopService вместо onServiceDisconnected(), почему это происходит?

РЕДАКТИРОВАТЬ: Чтобы добавить больше информации о связывании

Я вызываю bindService в методе onCreate (), а затем у меня метод releaseBind () отменяет привязку Сервиса.

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

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

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

Ответы [ 3 ]

43 голосов
/ 01 февраля 2010

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


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

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

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

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

10 голосов
/ 01 февраля 2010

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

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

.

4 голосов
/ 15 октября 2015

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

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

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...