Nella mia applicazione Android, ho una semplice visualizzazione elenco con adattatore. C'è una query pesante che è quella di riempire la vista elenco con i dati. Quindi lo metto in un IntentService che viene eseguito in un altro thread.Avvia IntentService da Attività e aggiorna Attività quando IntentService è terminato
In genere, IntentService viene eseguito separatamente, solo per interrogare alcuni dati e inserirlo nel database SQLite.
Ma ora mi piacerebbe avere la seguente possibilità:
- L'attività inizia l'IntentService con StartService().
- IntentService fa il suo lavoro pesante.
- Al termine di IntentService, è necessario informare l'attività sul risultato in modo che l'attività possa essere aggiornata per mostrare i nuovi dati.
È possibile? Ho letto un sacco di domande qui su Stack Overflow su questo argomento. Ma in ogni domanda, c'era un'altra soluzione. Quindi voglio chiederti a tutti: quale soluzione è la migliore per il mio scopo?
- Il collegamento di IntentService all'attività non sembra essere la soluzione migliore in quanto potrebbero esserci conflitti con le modifiche di configurazione dell'attività ecc. Corretto?
- This blog post suggerisce di utilizzare AIDL con Parcelables - che per me è molto complesso. C'è un modo più semplice, non è vero?
- Uno potrebbe impostare un ricevitore di trasmissione nell'attività e attivare questa trasmissione in IntentService al termine.
- Alcune persone dicono che dovresti use createPendingResult() to pass a PendingIntent in IntentService. Se IntentService rileva che PendingIntent nei suoi extra, lo utilizza per attivare onActivityResult() nell'attività. È questo il modo di scegliere?
Grazie mille per questa soluzione e la descrizione dettagliata! Devo registrare ResultReceiver o Intent personalizzato nel file manifest di Android? E posso inserire elementi come ArrayList o Cursor nel pacchetto di risultati? Ho bisogno di parcelables lì? – caw
Il ResultReceiver non ha bisogno di essere registrato nel manifest ma ho l'intento personalizzato registrato per i miei scopi. È possibile chiamare IntentService in qualsiasi modo si desideri purché ci sia un Intent per passare il ResultReceiver. Per quanto riguarda resultBundle puoi inserire tutto ciò che un Bundle può gestire. – Squonk
È interessante notare che due thread simili hanno ottenuto la soluzione accettata di utilizzare ResultReceiver, tuttavia il modo ufficiale sembra essere LocalBroadcastManager. Penso che il motivo per cui LocalBroadcastManager sia preferibile in quanto il ResultReceiver può essere distrutto se l'attività viene distrutta e quindi riavviata? –