2010-08-25 18 views
9

Ich entwickle eine App mit zahlreichen Aktivitäten. Ich möchte eine dauerhafte Benachrichtigung erstellen, die (mehr oder weniger) "AppName - Zurück zu AppName" sagt, die immer vorhanden ist, wenn meine Hintergrunddienste ausgeführt werden. Das Erstellen und Entsorgen der Benachrichtigung war kein Problem.Verwenden Sie eine dauerhafte Benachrichtigung, damit der Benutzer zur laufenden Android App zurückkehren kann

Nun könnte der Benutzer auf einem der verschiedenen Bildschirme/Aktivitäten sein, verlassen Sie die Anwendung, und dann möchten Sie die App über die Benachrichtigung erneut eingeben. Das Problem ist, die Benachrichtigung muss eine Absicht haben, die eine vorbestimmte Aktivität startet. Ich möchte, dass die Benachrichtigung die App unter erneut eingibt. Die Aktivität befindet sich ganz oben im Verlaufsstapel.

Mein erster Versuch bei einem hässlichen Workaround war, eine Aktivität zu machen (nennen wir es "returnFromNotify"), deren einzige Aufgabe es war, sich in "onCreate" zu "beenden". Die Benachrichtigung würde "returnFromNotify" im Bereich des Anwendungsverlaufs öffnen, der sich dann sofort selbst löscht und den Benutzer zurück zum vorherigen Verlaufsstatus im Anwendungsstapel sendet. Dies scheint zu funktionieren ... es sei denn, der Benutzer hat "zurück" verwendet, um die App vollständig zu beenden. Wenn sie dann auf die Benachrichtigung treffen, wird "returnFromNotify" geladen und anschließend wieder an den Startbildschirm gesendet (da im Verlaufsstapel für die App keine Aktivitäten vorhanden sind).

Ich überlegte, ob ich vor "returnFromNotify" etwas im History-Stack finden sollte, und wenn nicht, starte meine Hauptaktivität. Ich kann auch keinen Weg finden, dies zu tun.

Irgendwelche Eingaben oder Vorschläge für einen Java/Android Anfänger? FYI, Meine primäre Geschichte ist mit Skript-basierten Sprachen.

Antwort

6

Ich mag Ihre ursprüngliche Idee, eine „returnFromNotify“ Aktivität besser zu schaffen als die vorgeschlagene Abhilfe, da es möglich ist, zu erkennen, ob an der Unterseite des Stapels die ResumeActivity ist (und damit die einzige Aktivität im Stapel) .

Hier ist, wie Sie es tun können:

Fügen Sie Ihre ResumeActivity zu dem Manifest und geben Sie das noHistory Attribut:

<activity android:name=".ResumeActivity" android:noHistory="true" /> 

festlegen Nohistory wird diese Aktivität stellen Sie sicher nicht so schnell im Stapel bleiben wie es fertig ist. Auf diese Weise wissen Sie, dass nur eine aktuell ausgeführte Instanz von ResumeActivity im Stapel angezeigt wird.

Um die Anwendung Stapel zu überprüfen, werden Sie auch für die GET_TASKS Erlaubnis fragen müssen:

<uses-permission android:name="android.permission.GET_TASKS" /> 

Jetzt können Sie ActivityManager::getRunningTasks() verwenden, um festzustellen, ob ResumeActivity die einzige Aktivität im Stapel:

Ich weiß, dass Sie diese Frage vor mehr als 2 Jahren gestellt haben, aber ich gebe diese Antwort für den Fall, dass noch jemand in diese besondere Situation hineinläuft (so wie ich). Ich denke, mit der Lösung, auf die Sie ursprünglich hinarbeiteten, waren Sie auf dem richtigen Weg.

+0

Ja! Dieses Projekt war für einen Job, mit dem ich nicht mehr zusammen bin, also brauche ich es gar nicht ... aber es klingt GENAU, wonach ich gesucht habe, also danke! Hoffentlich findet es auch jemand anders nützlich. – Slobaum

3

Okay, ich glaube, dass ich ein zufriedenstellendes Workaround gefunden habe für meinen speziellen Fall. Ich habe meiner "mainActivity" eine statische Ganzzahl hinzugefügt, und jedes Mal, wenn "onCreate" ausgelöst wird, wird die Ganzzahl erhöht. Jedes Mal, wenn es "onDestroy" ausgelöst wird, dekrementiert es.

In meiner "returnFromNotify", ich schaue auf die statische Ganzzahl, um zu sehen, ob es größer als 0 ist. Wenn ja, ich nehme an, es gibt eine aktive "mainActivity", und die Ausführung "Finish" innerhalb "returnFromNotify" wird zurückgegeben Dort. Andernfalls wird davon ausgegangen, dass die Benutzer "gesichert" haben, beendet sich selbst und verwendet dann "startActivity", um eine neue Instanz von "mainActivity" zu starten.

Dies ist keine universelle Lösung, aber für meine Zwecke, denke ich, wird es ausreichen. Ich bin immer noch offen für andere Antworten, und wenn jemand ein Loch in meine Logik schlagen kann, tun Sie es bitte - konstruktive Kritik ist willkommen. Vielen Dank.

1

Ich denke, es keine einfache Möglichkeit, dies zu tun, sondern einen Zähler in der mainActivity der Zugabe würde ich verlängern Application:

Basisklasse für diejenigen, die globalen Anwendungszustand beibehalten müssen. Sie können Ihre eigene Implementierung von Angabe seines Namens in Ihrem AndroidManifest.xml des Tag liefern, die diese Klasse verursachen für Sie instanziiert werden, wenn der Prozess für Ihre Anwendung/Paket ist erstellt.

Ich würde die Umgebung zu der Logik dort und haben eine Methode wie:

public Intent getIntentForLastActivityShown(); 

aufgerufen werden, wenn die Meldungsposition geklickt wird.

+1

Wie würden Sie dann getIntentForLastActivityShown() verwenden? Wäre es nicht einfacher, die Benachrichtigung in der Application-Klasse zu verwalten und dann jedes Mal, wenn Sie einen neuen Intent-Aufruf starten, setLateEventInfo aus der Benachrichtigung und den PendingIntent auf die aktuelle sichtbare Aktivität zu aktualisieren. – schwiz

1

Meine erste Annäherung wäre, SharedPreferences zu verwenden und ein Schlüsselwertpaar zu speichern, das ungefähr wie lastDisplayedActivity genannt wird.

sharedPreferences.edit().putInteger("lastDisplayedActivity", ReturnFromNotify.THIS_ACTIVITY_NAME); 

Mit anderen Worten, speichern Sie eine Anwendung weite Variable, die angibt, welche Aktivität wurde zuletzt angezeigt: Dann in jeder Aktivität des onResume (und möglicherweise `onCreate ') Sie eine Zeile wie diese haben würden. Dann greifen Sie einfach diese Variable aus SharedPreferences und starten Sie die entsprechende Aktivität.

+0

Das ist keine schlechte Idee, aber ich würde Code zum Lebenszyklus jeder Aktivität hinzufügen (was ich lieber nicht tun würde). Würde der Start der entsprechenden Aktivität den Status der vorherigen Aktivitätsinstanz beibehalten oder würde sie eine neue Instanz dieser Aktivität erstellen? Ich brauche es wirklich, um den Status zu behalten, in dem sie sich befanden. – Slobaum

+0

Es kann den Status in einigen Fällen automatisch wiederherstellen, aber wenn Ihre Aktivität derzeit nicht angezeigt wird, kann Android * sie jederzeit beenden *, um zusätzlichen Speicherplatz zu beanspruchen. Mit anderen Worten, wenn Sie sicherstellen möchten, dass Sie den Status der Aktivität speichern, müssen Sie sie an einem anderen Ort speichern. Es gibt zahlreiche Möglichkeiten, dies zu tun, aber wenn Sie eine beträchtliche Menge an Daten haben, würde ich empfehlen, eine SQLite-Datenbank zu verwenden: http://developer.android.com/guide/topics/data/data-storage.html#db – Computerish

0

Normalerweise verwende ich Aktivität namens "Launcher", die den Status meiner Anwendung Modell prüft und Aktivitäten startet (oder andere Dinge tut) abhängig von Modellregeln. Ich legte Modell Objekt in meiner Anwendungsklasse. Modell kann Einstellungen verwenden, um seinen Zustand zu speichern. Ich mache es, um statische Felder bei Aktivitäten zu vermeiden.