2014-04-11 9 views
6

Erste Frage hier, aber ich bin schon seit einiger Zeit.Kommunizieren mit Vordergrund-Service android

Was muss ich:

Ich bin eine Android-App bauen, die Audio-Streams und Online-Wiedergabelisten spielt. Alles funktioniert jetzt gut, aber ich habe Probleme bei der Kommunikation mit meinem Service.

Die Musik spielt in einem Service, gestartet mit startForeground, so dass es nicht getötet wird.

Ich muss von meiner Tätigkeit mit dem Service kommunizieren, um den Titelnamen, das Bild und ein paar Dinge mehr zu bekommen.

Was ist mein Problem:

Ich glaube, ich brauche meinen Dienst mit bindService (statt meinem aktuellen Startservice) zu starten, so kann die Aktivität mit ihm sprechen.

Allerdings, wenn ich das tue, wird mein Dienst nach dem Schließen der Aktivität getötet.

Wie kann ich beides bekommen? Binde- und Vordergrunddienst?

Danke!

+0

Haben Sie versucht, eine Benachrichtigung für Ihren Service zu erstellen? Ich denke, das sollte verhindern, dass es getötet wird. – indivisible

+0

Hilft meine Antwort? – Libin

Antwort

6

Nr. bindService startet keinen Dienst. Es wird nur an die Service mit einer service connection binden, so dass Sie die instance des Dienstes Zugriff/Kontrolle es haben.

Nach Ihrer Anforderung hoffe ich, dass Sie die Instanz von MediaPlayer in Betrieb haben. Sie können den Dienst auch von Activity und dann bind starten. Wenn service bereits ausgeführt wird, wird onStartCommand() aufgerufen, und Sie können überprüfen, ob MediaPlayer instance nicht null ist, dann geben Sie einfach START_STICKY zurück.

Ändern Sie Activity wie dieses ..

public class MainActivity extends ActionBarActivity { 

    CustomService customService = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // start the service, even if already running no problem. 
     startService(new Intent(this, CustomService.class)); 
     // bind to the service. 
     bindService(new Intent(this, 
      CustomService.class), mConnection, Context.BIND_AUTO_CREATE); 
    } 

    private ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 
      customService = ((CustomService.LocalBinder) iBinder).getInstance(); 
      // now you have the instance of service. 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName componentName) { 
      customService = null; 
     } 
    }; 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (customService != null) { 
      // Detach the service connection. 
      unbindService(mConnection); 
     } 
    } 
} 

Ich habe ähnliche Anwendung mit MediaPlayerservice. lassen Sie mich wissen, ob dieser Ansatz Ihnen nicht hilft.

+0

In meiner Situation, wenn ich auf meinem Dienst entbinde. Der Dienst wird getötet. Weil die einzige Aktivität, die an sie gebunden ist, geschlossen wurde. Dies ist stark dokumentiert. Ich mache ein Downloader-System für meine App. Aber es tötet den Dienst. Wenn der Downloader fertig ist, habe ich stopSelf irgendwo innerhalb des Dienstes angerufen, so dass mein Dienst nicht für immer läuft. Irgendwelche Ideen? –

2

Zitiert Android documentation:

Ein gebundenes einmal zerstört alle Clients lösen, es sei denn, der Dienst auch

Und über den Unterschied zwischen und gebunden gestartet wurde gestartet nehmen nur ein siehe https://developer.android.com/guide/components/services.html

So müssen Sie den Service miterstellenund dann bindService, wie @Libin in seinem/ihrem Beispiel tut. Dann wird der Dienst ausgeführt, bis Sie stopService oder stopSelf verwenden oder bis Android entscheidet, dass es Ressourcen benötigt und Sie tötet.

Verwandte Themen