2010-11-06 21 views
40

sto cercando di iniziare una Service dal mio Activity di guardare fuori per i cambiamenti in una pagina web, è un'app privata in modo da non si preoccupano la durata della batteria ...Notifica attività dal servizio

Ma io Mi piacerebbe passare i dati dal mio Service al mio Activity ... Non riesco a trovare un modo per chiamare il Activity dal mio Service. Come posso raggiungere questo obiettivo?

risposta

47

Come indicato da Alex, è possibile eseguire il binding al servizio e passare una sorta di listener o callback al servizio da utilizzare sugli eventi.

In alternativa, è possibile utilizzare una trasmissione Intent, magari utilizzando metodi come setPackage() sul Intent di limitare la portata della trasmissione.

In alternativa, è possibile utilizzare per creare un createPendingResult()PendingIntent che si passa come un Intent in più per il servizio - il servizio può quindi utilizzare tale PendingIntent per innescare onActivityResult() nella vostra attività.

Oppure, è possibile utilizzare un ResultReceiver.

Oppure, è possibile utilizzare uno Messenger.

(è vero, non ho provato queste ultime due approcci, ma penso che lavorerà qui)

+0

Sto tentando di utilizzare l'intento in sospeso per chiamare onactivityresult, ma non viene richiamato affatto – Mars

+0

IntenTent notificationIntent = new Intent (this, activity.class); \t \t notificationIntent.putExtra ("captchaUrl", captchaUrl); \t \t PendingIntent contentIntent = PendingIntent.getActivity (this, 0, notificationIntent, 0); – Mars

+0

@mars: quello che stai facendo non è quello che ho scritto.Ho scritto: "Oppure puoi usare' createPendingResult() 'per creare un' PendingIntent' che passi come un 'Intento' extra al servizio - il servizio può quindi usare quel' PendingIntent' per attivare 'onActivityResult()' nella tua attività. " Non ho tentato di usare 'createPendingResult()' con una 'Notifica ', ma ho il sospetto che questo non funzionerà. Ricorda che in origine hai scritto "Mi piacerebbe passare i dati dal mio servizio alla mia attività", che non ha nulla a che vedere con una "Notifica". – CommonsWare

0

Il meccanismo ResultReceiver è stato spiegato in un altro post: - Restful API service tuttavia che non avrebbe funzionato in tutti i casi . Si prega di fare riferimento al mio commento su quel post. Il meccanismo di trasmissione dell'ambito limitato o PendingIntent sembra più adatto.

1

Alcuni modi brutti:

1.) Se l'attività non è ancora iniziata, quindi utilizzare intent e startActivity, ma ricordate intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2.) In caso contrario, se l'attività è iniziata già, è possibile scrivere il proprio metodo di callback nell'attività e registrare il metodo nel servizio, quindi chiamare direttamente il metodo nel servizio.

Spero di trovare un modo intelligente.

Penso che anche la trasmissione funzioni bene, è possibile scrivere una classe interna statica per ricevere la trasmissione e avviare l'attività. Ma è anche brutto secondo me.

3

Un'alternativa in più: se il tuo servizio aggiorna il fornitore di contenuti, l'attività può essere notificata tramite ContentObserver. Questo sarebbe sufficiente se il tuo servizio scarica alcuni dati dal server e desideri semplicemente visualizzare nuovi contenuti nell'attività.

Problemi correlati