2010-08-18 11 views

risposta

80

penso la risposta di Hara era un po 'di confusione. Ciò che descrivi è perfettamente legittimo e in effetti è l'unico modo per ottenere il comportamento che desideri. Se crei un servizio legandoti ad esso, morirà quando ti rilassi. Quindi l'unico modo per mantenerlo senza attività vincolanti è avviarlo con startService(). Non c'è alcun conflitto con i cicli di vita perché si applica solo a come il servizio viene avviato. Quindi, una volta avviato con startService(), segue il processo del ciclo di vita. Quindi sei libero di legarti e separarti quanto vuoi e morirà solo quando chiami stopService() o stopSelf()

+4

come si esegue il binding a un servizio avviato con startService()? – user123321

+3

@musselwhizzle: questa domanda è estremamente vecchia. Se hai una domanda, inizia una nuova discussione di domande. Ma non c'è differenza nel metodo in cui ti colleghi a un servizio che è già in esecuzione. – Falmarri

+1

Si noti inoltre che, per avere un servizio completamente rimosso dal ciclo di vita di un'attività, avviare il servizio passando il contesto dell'applicazione. Ciò significa che il servizio è legato al ciclo di vita dell'applicazione piuttosto che all'attività. Inoltre, controlla START_STICKY. Il riavvio iniziale e il contesto dell'applicazione consentono di eseguire il servizio rimosso dal ciclo di vita dell'applicazione e di riavviarsi autonomamente nel caso in cui non riesca prima di completare lo scopo. – superuserdo

8

Se si avvia un servizio utilizzando startService(), è necessario interromperlo utilizzando stopService().

Esistono due motivi per cui un servizio può essere eseguito dal sistema. Se qualcuno chiama Context.startService(), il sistema recupera il servizio (creandolo e chiamando il suo metodo onCreate() se necessario) e quindi chiama il suo metodo onStartCommand (Intent, int, int) con gli argomenti forniti dal client. A questo punto il servizio continuerà fino a quando viene chiamato Context.stopService() o stopSelf(). Si noti che più chiamate a Context.startService() non si annidano (sebbene risultino in più chiamate corrispondenti a onStartCommand()), quindi indipendentemente dal numero di volte in cui viene avviato, un servizio verrà arrestato una volta Context.stopService() o stopSelf() è chiamato; tuttavia, i servizi possono utilizzare il loro metodo stopSelf (int) per garantire che il servizio non venga arrestato finché non sono stati elaborati gli intenti avviati.

È possibile associare al servizio tutti i ServiceConnection desiderati con bindService(), ma prestare attenzione alla bandiera che gli è stata passata. Se si passa 0, se si chiama stopService() il servizio verrà interrotto (non so in modo esatto cosa succede a ServiceConnection). Altrimenti se vuoi che il tuo servizio sia attivo fino a che ServiceConnection viene associato ad esso, usa BIND_AUTO_CREATE.

questo da StopService():

Richiedere che un determinato servizio applicazione essere fermato. Se il servizio non è in esecuzione, non succede nulla. Altrimenti viene fermato. Si noti che le chiamate a startService() non vengono conteggiate: ciò interrompe il servizio, indipendentemente dal numero di volte in cui è stato avviato.

Si noti che se un servizio arrestato ha ancora oggetti ServiceConnection ad esso associati con il set BIND_AUTO_CREATE, non verrà distrutto fino a quando tutti questi binding non verranno rimossi. Consultare la documentazione del servizio per ulteriori dettagli sul ciclo di vita di un servizio.

Questa funzione genererà SecurityException se non si dispone dell'autorizzazione per interrompere il servizio specificato.

Spero che questo aiuta ..

8

Sì, puoi avviare e associare (una o più volte) lo stesso servizio .

Il seguente diagramma di flusso mostra come viene gestito il ciclo di vita di un servizio.Il contatore variabile tiene traccia del numero di client associati: enter image description here

Buon esempio: app musicale. Spiegazione da Building a Media Browser Service esercitazione ufficiale:

Un servizio che è destinato solo (e non avviato) viene distrutta quando tutti dei propri clienti unbind. Se l'attività dell'interfaccia utente si disconnette a questo punto, il servizio viene eliminato. Questo non è un problema se non hai ancora giocato a . Tuttavia, quando inizia la riproduzione, l'utente probabilmente si aspetta di continuare ad ascoltare anche dopo aver cambiato app. Non devi voler distruggere il player quando non si disinteressa l'interfaccia utente per lavorare con un'altra app .

Per questo motivo, è necessario assicurarsi che il servizio venga avviato quando inizia a giocare chiamando startService(). Un servizio avviato deve essere arrestato esplicitamente, indipendentemente dal fatto che sia associato o meno. Ciò garantisce che il tuo lettore continui a funzionare anche se l'attività di controllo dell'interfaccia utente non si svolge.

Per interrompere un servizio avviato, chiamare Context.stopService() o stopSelf(). Il sistema si arresta e distrugge il servizio il prima possibile. Tuttavia, se uno o più client sono ancora associati al servizio, la chiamata per interrompere il servizio viene ritardata fino a quando tutti i client non si disconnettono.

Da Service ref:

un servizio può essere sia iniziato e hanno connessioni associate ad esso. In tale caso , il sistema manterrà attivo il servizio oppure avviato o ci sono uno o più collegamenti con il flag Context.BIND_AUTO_CREATE. Una volta che non si verifica nessuna di queste situazioni, il metodo onDestroy() del servizio si chiama e il servizio è effettivamente terminato.

Problemi correlati