2013-07-16 9 views
6

Ho 2 attività, A & B. Il servizio inizia in B con tale codice:Come interrompere il servizio da un'altra attività 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) { 
    } 
}; 

ho bisogno di avere la possibilità di chiudere il servizio quando sono in attività A (B è chiusa, ma musica ascolti). Come chiamare StopService da A onDestroy()? Devo separarmene, se sì, come e dove?

Inserire semplicemente stopService(new Intent(this,PlayerService.class)); porta a un errore: l'attività B ha interrotto la connessione di servizio ... che era originariamente legata qui. (Ma B è già chiusa)

risposta

4

Si dovrebbe svincolare il servizio in B onStop(), allora è possibile chiamare StopService in A.

+0

Grazie, proverò – Tramway11

+0

startService in onCreate, collego onStart e si disattiva in onStop. –

+0

Sembra funzionare, se solo più esecuzioni di B e di nuovo su A non possono causare alcuni problemi (ad esempio, la connessione non è stata attivata/disattivata nel tempo, alcuni problemi concomitanti). – Tramway11

1

è necessario Unbind il service prima di distruggere il vostro Activity. unbindService(myConnection);

+0

I.e. onDestroy() in B Devo mettere Unbind? – Tramway11

+0

Sì, è giusto. Se non funziona, usa onStop() – Oli

1

Provare unbindService() nel vostro onStop()

3

Quindi, per cancellare alcune cose in su. I servizi possono essere di due tipi, non necessariamente reciprocamente esclusivi.

Questi due tipi sono avviati e delimitati.

Un servizio avviato è uno iniziato con startService() e viene in genere utilizzato per eseguire operazioni in background che sono in qualche modo indipendenti dal flusso dell'attività. Ad esempio, un ampio servizio per scaricare i dati remoti può essere eseguito indipendentemente dall'attività che lo ha creato e quindi restituire semplicemente il risultato quando è pronto.

Un servizio avviato continua a funzionare finché non si interrompe.

Un servizio BOUNDED è più simile a un pattern IPC client-server. Ad esempio, un lettore multimediale audio dovrebbe essere un servizio associato affinché l'attività possa interrogare il servizio sullo stato del lettore multimediale, ad es. traccia nome, lunghezza ...

Un servizio associato rimane attivo finché vi è un componente associato.

Quindi, se il servizio è avviato, è necessario interromperlo dall'interno dell'implementazione del servizio con stopSelf() o stopService(). Se è vincolato, si ferma quando non ci sono più componenti legati ad esso. Non ti sei associato a un servizio con unbindService(). Si noti che un servizio può essere sia un servizio avviato che un servizio associato!

Per ulteriori informazioni, fare riferimento a questo:

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

Considerate anche utilizzando un IntentService invece di un Service nell'applicazione, in quanto sembra che non è necessario il vostro servizio essere multithread.

Problemi correlati