Служба не останавливается при вызове метода 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");
}
}