2013-07-16 12 views
6

Mam 2 rodzajów działalności, & B. Usługa rozpoczyna się w B z takim kodem:Jak zatrzymać usługę z innej aktywności w systemie Android?

startService(new Intent(this, PlayerService.class)); 
      Intent connectionIntent = new Intent(this, PlayerService.class); 
      bindService(connectionIntent, mp3PlayerServiceConnection, Context.BIND_AUTO_CREATE); 

private ServiceConnection mp3PlayerServiceConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName arg0, IBinder binder) { 
     mp3Service = ((LocalBinder) binder).getService(); 
     Thread t = new Thread() { 
     public void run() { 
     mp3Service.playSong(getApplicationContext(),url); 
     } 
     }; 
     t.start(); 
    } 
    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
    } 
}; 

muszę mieć możliwość, aby zamknąć usługę, kiedy jestem na aktywność A (B jest zamknięty, ale muzyka gra). Jak wywołać StopService z A onDestroy()? Czy muszę go rozwiązać, jeśli tak, jak i gdzie?

Po prostu umieszczenie stopService(new Intent(this,PlayerService.class)); prowadzi do błędu: Aktywność B spowodowała wyciek połączenia usługi ... które pierwotnie było tutaj ograniczone. (Ale B jest już zamknięty)

Odpowiedz

4

należy rozpiąć usługę w OnStop (B), a następnie można nazwać stopService w A.

+0

Dzięki, spróbuj – Tramway11

+0

StartService w onCreate, bind on onStart i unbind w onStop. –

+0

Wydaje się działać, jeśli tylko kilka przebiegów B i powrót do A nie może powodować pewnych problemów (np. Połączenie nie zostało przerwane w czasie, niektóre współbieżne problemy). – Tramway11

1

trzeba Unbind się service przed niszcząc Activity. unbindService(myConnection);

+0

tj. onDestroy() in B Muszę umieścić Unbind? – Tramway11

+0

Tak, to prawda. Jeśli to nie zadziała, użyj on onStop() – Oli

1

Spróbuj unbindService() w swojej onStop()

3

Tak, aby usunąć niektóre rzeczy. Usługi mogą być dwojakiego rodzaju, niekoniecznie wykluczające się wzajemnie.

Te dwa typy są uruchamiane i ograniczone.

Usługa STARTED jest uruchamiana z startService() i jest zwykle używana do wykonywania operacji w tle, które są nieco niezależne od przepływu aktywności. Na przykład usługa pobierania danych zdalnych może działać niezależnie od działania, które ją utworzyło, a następnie po prostu zwrócić wynik, gdy jest gotowy.

Uruchomiona usługa działa, dopóki się nie zatrzyma.

Usługa BOUNDED jest bardziej podobna do wzorca IPC klient-serwer. Na przykład odtwarzacz multimediów audio powinien być usługą powiązaną, aby działanie mogło wysyłać zapytania do usługi o stanie odtwarzacza multimedialnego, np. nazwa utworu, długość ...

Usługa związana jest dostępna tak długo, jak długo istnieje powiązana z nią komponent.

Tak więc, jeśli twoja usługa jest uruchomiona, powinieneś zatrzymać ją od wewnątrz swojej usługi z stopSelf() lub stopService(). Jeśli jest związany, zatrzymuje się, gdy nie ma już do niego żadnych elementów. Rozpięliście usługę za pomocą unbindService(). Zwróć uwagę, że usługa może być zarówno usługą uruchomioną, jak i związaną!

Aby uzyskać więcej informacji, patrz poniżej:

http://developer.android.com/guide/components/services.html

Rozważmy również używając IntentService zamiast Service w aplikacji, ponieważ wydaje się, że nie trzeba usługę być wielowątkowych.