2016-01-07 29 views
7

Attualmente sto scrivendo un programma Android che necessita di un IntentService. Quando inserisco il codice nella funzione onHandleIntent, il codice non viene eseguito, ma non fornisce errori nello MainActivity. Ma quando copio il mio codice nel onStartCommand, funziona perfettamente.Android la differenza tra onHandleIntent e onStartCommand

Il problema è che voglio sapere quali sono le differenze tra onHandleIntent e onStartCommand. Grazie.

CODICE:

In onHandleIntent:

System.out.println("SERVICE STARTED! ! !"); 
//System.out.println(intent.getBooleanExtra("once", Boolean.FALSE)); 
if (intent.getBooleanExtra("once", Boolean.FALSE)) { 
    Check(); 
} 
mHandler.postDelayed(mRunnable, 3000); 

risposta

21

Dal the docs:

Il IntentService esegue le seguenti operazioni:

  • Crea un thread di lavoro predefinito che esegue tuttointenti consegnati a onStartCommand() separati dal thread principale dell'applicazione.
  • Crea una coda di lavoro che passa un intento alla tua implementazione onHandleIntent(), quindi non dovrai mai preoccuparti del multi-threading .
  • Arresta il servizio dopo che tutte le richieste di avvio sono state gestite, quindi non è necessario chiamare stopSelf().
  • Fornisce l'implementazione predefinita di onBind() che restituisce null.
  • Fornisce un'implementazione predefinita di onStartCommand() che invia l'intento alla coda di lavoro e quindi all'implementazione onHandleIntent() .

E anche:

Tutto questo si aggiunge al fatto che tutto quello che dovete fare è implementare onHandleIntent() per fare il lavoro fornito dal cliente. (Anche se, è inoltre necessario fornire un piccolo costruttore per il servizio.)

Quindi, un IntentService è un "Custom" Service con quelle proprietà speciali. Quindi non c'è bisogno di scavalcare lo onStartCommand(), in realtà, non dovresti farlo a meno che tu non stia usando la normale classe Service.

Alcuni esempi di utilizzo IntentService:

Activity.java

Intent it = new Intent(getApplicationContext(), YourIntentService.class); 
it.putExtra("Key", "Value"); 
startService(it); 

YourIntentService.java

public YourIntentService() { 
    super("YourIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    if (intent != null) { 
     String str = intent.getStringExtra("key"); 
     // Do whatever you need to do here. 
    } 
    //... 
} 

È inoltre possibile controllare this tutorial o this one per maggiori informazioni su Service e IntentService.

Inoltre, controllare the docs.

+2

Wow, questo è stato incredibilmente approfondito. Bella risposta! – AdamMc331

+0

Ho seguito i tutorial, sono fantastici! Ma il problema è che non ho '@ overide' the' onStartCommand' o' onHandleIntent'? – Chromium

+0

Hai detto sulla domanda che hai fatto l'override di 'onStartCommand', e non dovresti farlo su' IntentService'. Usa 'onHandleIntent' invece, viene chiamato automaticamente. – Mauker

3

onStartCommand viene utilizzato quando si utilizza un Service. onHandleIntent deve essere invece utilizzato quando si utilizza uno IntentService. IntentService estende Service. E come da documentazione

"Non si dovrebbe eseguire l'override di questo metodo (onStartCommand) per il vostro IntentService. Al contrario, ignorare onHandleIntent(Intent), che il sistema chiamate quando l'IntentService riceve una richiesta di avvio."

se avete sovrascritto onStartCommand, che potrebbe essere il motivo per cui il vostro onHandleIntent non è sempre chiamato.

+1

Se ** fai ** override 'onStartCommand()' quando usi 'IntentService' non otterrai il tuo' onHandleIntent() 'chiamato in seguito, ** a meno che ** l'ultima riga del tuo' onStartCommand() 'sia 'return super.OnStartCommand (intent, flags, startId)'. – GeertVc

1

Non è necessario eseguire l'override di onStartCommand() per IntentService.

In tal caso, assicurarsi di return super.onStartCommand();, perché questo invia l'intento alla coda di lavoro e quindi all'implementazione onHandleIntent().