2010-11-06 15 views
40

Ich versuche, ein Service von meinem Activity zu beginnen für Änderungen zu achten ist auf einer Web-Seite, dann ist es eine private App so nicht die Mühe ich nicht die Lebensdauer der Batterie ...Benachrichtigen Aktivität von Service

Aber ich würde gerne Daten von meinem Service an meine Activity übergeben ... Ich kann nicht scheinen, einen Weg zu finden, um die Activity von meinem Service anrufen. Wie kann ich das erreichen?

Antwort

47

Wie von Alex angegeben, können Sie eine Bindung an den Dienst herstellen und eine Art Listener oder Rückruf an den Dienst übergeben, der für Ereignisse verwendet werden soll.

Oder Sie können eine Sendung Intent verwenden, vielleicht mit Methoden wie setPackage() auf Intent, um den Umfang der Sendung zu begrenzen.

Oder Sie können createPendingResult() verwenden, um ein PendingIntent zu erstellen, die Sie als Intent extra den Dienst übergeben - der Service kann dann, dass PendingIntentonActivityResult() in Ihrer Aktivität auszulösen.

Oder Sie können eine ResultReceiver verwenden.

Oder Sie können eine Messenger verwenden.

(zugegebenermaßen, ich habe nicht diese beiden letztgenannten Ansätze versucht, aber ich denke, sie werden hier arbeiten)

+0

Ich versuche die ausstehende Absicht zu verwenden, um onactivityresult aufzurufen, aber es wird überhaupt nicht aufgerufen – Mars

+0

Intent 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: Was du tust, ist nicht das, was ich geschrieben habe.Ich schrieb: "Oder Sie können' createPendingResult() 'verwenden, um einen' PendingIntent' zu erstellen, den Sie als 'Intent'-Extra an den Service übergeben - der Service kann dann diesen' PendingIntent' verwenden, um 'onActivityResult() 'auszulösen in deiner Aktivität. " Ich habe nicht versucht, 'createPendingResult()' mit einer 'Notification' zu verwenden, aber ich vermute, dass dies nicht funktioniert. Denken Sie daran, dass Sie ursprünglich geschrieben haben: "Ich möchte Daten von meinem Dienst an meine Aktivitäten weitergeben", was nichts mit einer "Benachrichtigung" zu tun hat. – CommonsWare

0

Der ResultReceiver Mechanismus in einem anderen Beitrag erklärt wurde: - Restful API service Allerdings wäre es nicht in allen Fällen funktionieren . Bitte beachten Sie meinen Kommentar zu diesem Beitrag. Der eingeschränkte Übertragungsbereich oder PendingIntent-Mechanismus scheint geeigneter zu sein.

1

Einige hässliche Weise:

1.) Wenn die Aktivität noch dann intent und startActivity, nicht gestartet wurde, verwenden aber intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2.) Andernfalls, wenn die Aktivität bereits begonnen hat, können Sie sich erinnern schreiben eigene Callback-Methode in der Aktivität und registrieren Sie die Methode im Service, dann rufen Sie die Methode im Service direkt auf.

Hoffe, einen klugen Weg zu finden.

Ich denke Broadcast auch gut funktionieren, können Sie eine statische innere Klasse für den Empfang Broadcast schreiben und starten Sie die Aktivität. Aber es ist meiner Meinung nach auch hässlich.

3

Eine weitere Alternative: Wenn Ihr Dienst den Inhaltsanbieter aktualisiert, kann die Aktivität über gemeldet werden. Dies würde ausreichen, wenn Ihr Dienst einige Daten vom Server herunterlädt und Sie lediglich neue Inhalte in der Aktivität anzeigen möchten.

Verwandte Themen