2011-12-02 3 views
8

Sono un po 'confuso su come servizi di funzione, in particolare queste due cose:Android - Com'è possibile che un servizio continui a funzionare dopo che l'attività è stata chiusa?

Da http://developer.android.com/guide/topics/fundamentals/services.html:

Un servizio viene "ha iniziato" quando un componente di applicazione (come ad esempio un'attività) avvia chiamando StartService(). Una volta avviato, un servizio può essere eseguito in background indefinitamente, anche se il componente che lo ha avviato viene distrutto.

e:

Attenzione: Un servizio viene eseguito nel thread principale del suo hosting di processo del servizio non crea proprio thread e non viene eseguito in un processo separato (se non diversamente specificato) .

Le mie domande:

  1. Come è possibile per un servizio che è stato avviato da StartService() sopravvivono, se il thread principale attività si chiude? O solo quei servizi sopravvivono allo spegnimento dell'attività principale, che si trova in un thread separato?

  2. Come posso avviare un servizio in un thread separato? Il documento di sviluppo su http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingService mostra solo un esempio su come generare un thread quando viene creato il servizio ... non come generare il servizio stesso in una nuova discussione ...
    MODIFICA: È android:process= in manifest.xml utilizzato per avviarlo in un thread separato? (Se inizia in un nuovo processo, allora deve essere in un thread separato ..)

+0

Potresti accettare la risposta? Grazie –

+0

@ Kiran, accetto, se anche la mia seconda domanda è stata risolta. Vedi la mia modifica su un'ipotesi su come risolverlo. – sydd

+0

Generalmente si generano i thread per distribuire il carico. Ma lo scopo di un servizio è di eseguire alcune operazioni pesanti senza interferire con l'attività. Rispondi a questa domanda: "Puoi avviare un'attività su un thread separato?". Con tutta probabilità, la stessa risposta è applicabile anche ad un servizio. –

risposta

6

Per citare ,:

Attenzione: Un servizio viene eseguito nel thread principale del suo processo di hosting-il servizio non crea proprio thread e non viene eseguito in un processo separato (a meno che non specifichi altrimenti).

Quando l'attività principale viene arrestata, non significa necessariamente che il processo di hosting sia terminato. Secondo la documentazione, il servizio continua a funzionare perché il processo è vivo!

check this

Il sistema Android tenterà di mantenere il processo che ospita un servizio in tutto il tempo che il servizio è stato avviato o ha clienti legati ad esso. Quando si esaurisce la memoria e si devono eliminare i processi esistenti, la priorità di un processo che ospita il servizio sarà la più alta

Quindi, solo quando si esauriscono le risorse ed è necessario eliminare i processi in giro, il processo sarebbe stato ucciso Altro. il processo continua e il vostro servizio.

+0

Grazie, questo risponde alla mia prima domanda perfettamente. – sydd

4
  1. Un servizio avviato può sopravvivere l'arresto di un'attività che inizia esattamente nello stesso modo in cui un'attività può sopravvivere allo spegnimento di un'altra attività che la avvia con startActivity(). Le attività e i servizi sono solo due componenti separati del processo di candidatura. Una volta avviato, ciascuno esiste indipendentemente dall'altro. (Le cose sono un po 'diverse con i servizi associati — il sistema interromperà un servizio associato quando non vi è più alcun collegamento.)

  2. Non è possibile avviare un servizio in un thread separato, non più di quanto è possibile avviare un'attività in un thread non evento. È possibile solo chiedere al sistema di avviare il servizio (tramite startService() o bindToService()). Il sistema avvia sempre il servizio sul thread dell'evento.

+0

e cosa succede se si specifica android: process = ": remote" per il mio servizio in manifest.xml? Sarà ancora sullo stesso thread? – sydd

+0

@sydd - Se si specifica un nome di processo come quello, verrà effettivamente eseguito in un thread separato perché sarà in un processo separato. Il servizio verrà comunque eseguito nel thread di eventi di quell'altro processo, tuttavia, quindi è ancora necessario scrivere il servizio di conseguenza (richiedendo un lavoro dispendioso in termini di tempo in un thread di lavoro). –

+0

@Todd Sei sicuro che verrà eseguito nel thread dell'evento? se faccio un servizio con il proprio 'android: process', e metto un' wait (5000) 'nel suo metodo' handleMessage() ', non bloccherà il thread dell'interfaccia utente. Ma se rimuovo la dichiarazione 'android: process', il comando wait blocca il thread dell'interfaccia utente. – sydd