2014-04-11 26 views
6

Prima domanda qui, ma sono in giro da un po '.Comunicare con il servizio di primo piano android

Cosa devo:

Sto costruendo un app Android che svolge flussi audio e le playlist on-line. Adesso funziona tutto bene, ma ho problemi a comunicare con il mio servizio.

La musica è in riproduzione in un servizio, avviato con startForeground, quindi non viene ucciso.

Ho bisogno di comunicare dalla mia attività con il servizio, per ottenere il nome della traccia, l'immagine e un paio di altre cose.

Che cosa è il mio problema:

Penso di aver bisogno di iniziare il mio servizio con bindService (invece del mio StartService corrente) in modo l'attività può comunicare con esso.

Tuttavia, quando lo faccio, il mio servizio viene ucciso dopo aver chiuso l'attività.

Come posso ottenere entrambi? Binding e primo piano?

Grazie!

+0

Hai provato a fare una notifica per il tuo servizio? Penso che dovrebbe aiutare a impedirlo di essere ucciso. – indivisible

+0

La mia risposta ha aiutato? – Libin

risposta

6

No. bindService non avvia un servizio. Legherà semplicemente allo Service con uno service connection, in modo da avere il instance del servizio per accedervi/controllarlo.

Secondo le vostre esigenze, spero che avrete l'istanza di MediaPlayer in servizio. È inoltre possibile avviare il servizio da Activity e quindi da bind. Se è già in esecuzione serviceonStartCommand(), è possibile verificare se l'istanza MediaPlayer non è nulla, quindi è sufficiente restituire START_STICKY.

cambiamento che Activity come questo ..

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

Ho un'applicazione simile con MediaPlayerservice. fammi sapere se questo approccio non ti aiuta.

+0

Nella mia situazione se non mi fido del mio servizio. Il servizio viene ucciso. Perché l'unica attività che è legata ad esso è stata chiusa/ha perso la vista. Questo è altamente documentato. Sto facendo un sistema di downloader per la mia app. Ma uccide il servizio. Quando il downloader è terminato, ho smesso di chiamare da qualche parte all'interno del servizio, quindi il mio servizio non funziona per sempre. Qualche idea? –

2

Citando Android documentation:

Un servizio legato viene distrutta una volta tutti i clienti rimuovi l'assegnazione, a meno che il servizio è stato anche avviato

E circa la differenza tra iniziato e legato Basta prendere un guardare a https://developer.android.com/guide/components/services.html

Quindi, è necessario creare il servizio utilizzando startService e quindi bindService, come @Libin fa nel suo esempio. Quindi, il servizio verrà eseguito fino all'utilizzo di stopService o stopSelf o fino a quando Android non deciderà di aver bisogno di risorse e di ucciderti.