Android onCreate o onStartCommand per l'avvio del servizio


105

Di solito quando creo un servizio Android implemento il onCreatemetodo, ma nel mio ultimo progetto questo non funziona. Ho provato a implementareonStartCommand e sembra funzionare.

La domanda è: quando devo implementare un servizio quale metodo è richiesto? Quali metodi devo implementare? onCreate, onStartCommando entrambi? E qual è il ruolo di ciascuno?


onCreateè sempre chiamato a prescindere
IgorGanapolsky

Risposte:


189

onCreate()viene chiamato quando l' Serviceoggetto viene istanziato (cioè: quando viene creato il servizio ). In questo metodo dovresti fare cose che devi fare solo una volta (es: inizializzare alcune variabili, ecc.). onCreate()sarà chiamato solo una volta per oggetto istanziato .

È necessario implementare solo onCreate()se si desidera / è necessario inizializzare qualcosa solo una volta .

onStartCommand()viene chiamato ogni volta che un client avvia il servizio utilizzando startService(Intent intent). Ciò significa che onStartCommand()può essere chiamato più volte. Dovresti fare le cose in questo metodo che sono necessarie ogni volta un client richiede qualcosa dal tuo servizio. Dipende molto da cosa fa il tuo servizio e da come comunica con i clienti (e viceversa).

Se non esegui l'implementazione onStartCommand(), non sarai in grado di ottenere alcuna informazione dal Intentclient a cui passa il client onStartCommand()e il tuo servizio potrebbe non essere in grado di svolgere alcun lavoro utile.


6
Possono esistere due istanze dello stesso servizio all'interno di un'applicazione?
jacktrades

1
@jacktrades Teoricamente e secondo la documentazione: No. Tuttavia, sembra esserci qualche bug in Android dove effettivamente in determinate circostanze creerà più istanze di un Servizio. Tuttavia, come ho detto, questo è un bug e non siamo stati in grado di riprodurlo in modo affidabile a nostro piacimento. Perché stai chiedendo?
David Wasser

3
@Mr_and_Mrs_D Non ci sono bug ufficiali segnalati per quanto ne so. Tuttavia, ci sono diverse segnalazioni di ciò che accade e ho un'applicazione in cui so che sta accadendo. Non sono riuscito a ridurre il problema a qualcosa di piccolo e ripetibile, quindi non ho segnalato un bug da solo. La documentazione non afferma esplicitamente che i servizi sono singoli, ma è molto chiaro che questo è ciò che si intende. Guarda i documenti per 'startService () `: afferma chiaramente che se il servizio non è già in esecuzione, verrà creato e avviato, se è in esecuzione rimane in esecuzione
David Wasser

6
@Diffy Quando chiami startService(), se il servizio non è in esecuzione, Android creerà un'istanza della classe di servizio (questo è un oggetto di servizio) e quindi chiamerà onCreate()quell'oggetto. Quindi richiamerà onStartCommand()quell'oggetto. Se, qualche tempo dopo, chiami di nuovo startService(), se il servizio è ancora in esecuzione, Android non creerà un nuovo oggetto servizio. Invece, chiamerà semplicemente onStartCommand()l'oggetto del servizio esistente. È chiaro?
David Wasser

1
Ti amo! (y) ha funzionato come per magia (y) spiegazione molto semplice e buona
Hilton Khadka

11

Il servizio si comporta come attività Qualunque cosa tu voglia associateuna volta con un servizio andrà onCreatecome inizializzazione

e ogni volta che il service viene chiamato utilizzando startService . onStartCommandsarà chiamato. e puoi passare qualsiasi azione da eseguire. come per un lettore musicale, puoi riprodurre, mettere in pausa, smettere di usare l'azione

E fai qualsiasi cosa operation in serviceinviando un'azione e ricevendolaonStartCommand

onCreate lavora come un costruttore.

Modifica in breve

onCreate()chiama solo per la prima volta che si avvia un Servicementre onStartCommand()chiama ogni volta che si chiama di startServicenuovo. Ti consente di impostare un'azione come riprodurre, interrompere, mettere in pausa la musica.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

Quindi, quando chiamo un servizio utilizzando startService (intent), onCreate () non verrà chiamato? Ho un dubbio nel capire cosa sia un "oggetto servizio" perché ho sempre avviato un servizio da startSevice (intent).
Diffy

hai istanziato correttamente l'oggetto del servizio o probabilmente non hai il servizio nel tuo manifest
AndroidGeek

avviare un servizio come startService (new Intent (this, ServiceName.class));
AndroidGeek

Ma questo metodo si chiama creazione di istanze del servizio? Dov'è allora l'oggetto-servizio?
Diffy

è un modo per chiamare Activity e Service using intent è responsabile dell'apertura di Activity and Service in Android. Quello che vuoi fare con l'oggetto del servizio puoi farlo anche con l'intento. intendo passare i dati al servizio
AndroidGeek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.