2013-07-16 10 views
6

I 2 Aktivitäten, A & B. Der Dienst beginnt in B mit einem solchen Code:So stoppen Sie den Dienst von einer anderen Aktivität in 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) { 
    } 
}; 

Ich brauche eine Möglichkeit zu haben, den Dienst zu schließen, wenn ich auf die Aktivität bin A (B geschlossen ist, aber Musik spielt). Wie StopService von A onDestroy() aufrufen? Muss ich es lösen, wenn ja, wie und wo?

Einfach setzen stopService(new Intent(this,PlayerService.class)); führt zu einem Fehler: Aktivität B hat Serviceverbindung geleakt ... die ursprünglich hier gebunden wurde. (Aber B ist bereits geschlossen)

Antwort

4

Sie sollten Service in B OnStop() lösen, dann können Sie in Stopservice A. nennen

+0

Danke, ich werde versuchen – Tramway11

+0

startService in onCreate, bind in onStart und unbind in onStop. –

+0

Scheint zu funktionieren, wenn nur mehrere Läufe von B und zurück zu A einige Probleme verursachen können (z. B. wurde die Verbindung nicht rechtzeitig hergestellt/unterbrochen, einige gleichzeitige Probleme). – Tramway11

1

Sie die serviceUnbind müssen, bevor Ihr Activity zu zerstören. unbindService(myConnection);

+0

I.E. onDestroy() in B Ich muss Unbind setzen? – Tramway11

+0

Ja, das stimmt. Wenn es nicht funktioniert, benutze onStop() – Oli

1

Try unbindService() in Ihrem onStop()

3

So up einige Dinge zu klären. Es gibt zwei Arten von Dienstleistungen, die sich nicht gegenseitig ausschließen müssen.

Diese beiden Typen sind gestartet und begrenzt.

Ein STARTED-Dienst ist ein Dienst, der mit startService() gestartet wurde und normalerweise für Hintergrundoperationen verwendet wird, die vom Aktivitätsablauf etwas unabhängig sind. Zum Beispiel kann ein Dienst zum Herunterladen von entfernten Daten unabhängig von der Aktivität ausgeführt werden, die ihn erzeugt hat, und dann einfach das Ergebnis zurückgeben, wenn er bereit ist.

Ein gestarteter Dienst läuft weiter, bis er sich selbst stoppt.

Ein BOUNDED-Dienst ähnelt eher einem Client-Server-IPC-Muster. Zum Beispiel sollte ein Audio-Media-Player ein gebundener Dienst sein, damit die Aktivität den Dienst über den Zustand des Media-Players abfragen kann, z. Titelname, Länge ...

Ein gebundener Dienst funktioniert so lange, wie eine Komponente daran gebunden ist.

Also, wenn Ihr Dienst gestartet wird, sollten Sie es innerhalb Ihrer Service-Implementierung mit stopSelf() oder stopService() stoppen. Wenn es gebunden ist, stoppt es sich selbst, wenn keine Komponenten mehr daran gebunden sind. Sie lösen einen Dienst mit unbindService(). Beachten Sie, dass ein Dienst sowohl ein gestarteter als auch ein gebundener Dienst sein kann!

Weitere Informationen finden Sie das:

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

Betrachten Sie auch eine IntentService anstelle eines Service in Ihrer Anwendung verwenden, da es scheint, dass Sie benötigen, um Ihre Service nicht Multithreading zu sein.

Verwandte Themen