2010-02-01 5 views
23

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

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

stop_Scan_Button = (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); 
    } 

Так что я полагаю, что развязывание это не моя проблема?

ответ

42

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


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

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

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

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

+1

Я редактировал мой первоначальный вопрос, чтобы включить информацию о моем связывании, у меня это связывание, а затем развязывание –

+2

Ummm, что код полностью перепутались и почти наверняка способствуя вашей проблеме. 'bindService()' и 'unbindService()' являются асинхронными и гарантированно терпят неудачу, как вы их используете. К сожалению, я понятия не имею, что вы пытаетесь сделать здесь, поэтому у меня нет хорошего способа советовать вам дальше. – CommonsWare

+0

Его просто интерфейс с двумя кнопками, один для запуска службы и один, чтобы остановить его. Я принял утверждение if из моего метода releaseBind(), оставив только unBindService (это); Это, как представляется, отменяет регистрацию Службы, когда я нажимаю на нее второй раз, когда получаю ошибку «Служба не зарегистрирована». Однако stopService по-прежнему не вызывает вызов метода onDestroy() в моей службе, функции фоновой службы все еще функционируют –

10

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

A service can be used in two ways. двух режимов не полностью отдельно. Вы можете привязать к службе , которая была запущена с помощью startService(). Например, фоновая музыка может быть запущена при вызове startService() с объектом Intent , который идентифицирует музыку для воспроизведения. Только позже, возможно, когда пользователь хочет осуществлять некоторый контроль над плеер или же получить информацию о текущей песни, будет деятельность установить соединение с услугой по телефону bindService(). В тех случаях, как это, StopService() будет не фактически остановить службу до последнего связывания закрыт

.

+0

Yeh Я связываю его только один раз, а затем вызываю releaseBind(), чтобы развязать –

4

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

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

} 
} 
Смежные вопросы