5 Stimmen

Warum wird beim Starten einer Aktivität über ein Widget auch meine Hauptaktivität gestartet?

Wenn ich eine Aktivität von einem Widget aus starte, möchte ich, dass die Schaltfläche "Zurück" zum Startbildschirm zurückkehrt, aber stattdessen wird die Hauptaktivität der Anwendung angezeigt. Nach einigem Herumprobieren habe ich festgestellt, dass dieses Problem nicht auftritt, wenn ich die Hauptaktivität der App irgendwie schließe. Seltsam.

Ich habe eine Lösung gefunden aquí die besagt, dass ich finish(); in der onPause() meiner Hauptaktivität aufrufen soll. Offensichtlich ist dies die falsche Lösung z.B. Neuausrichtung des Bildschirms verursacht eine onPause() so die Aktivität wird sterben, wenn das Telefon gedreht wird.

So beginne ich meine Tätigkeit:

@Override
public void onReceive(Context context, Intent intent) {
    [...]
        //new Emergency().emDialog(context).show();
        Intent myIntent = new Intent(context, EmergencyActivity.class);

        // FLAG_ACTIVITY_NEW_TASK is needed because we're not in an activity
        // already, without it we crash.
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(myIntent);

Den Rest des Codes finden Sie unter http://code.google.com/p/emergencybutton/source/browse

edit: Ich habe versucht, die Aktivität anders auszuführen, aber sie funktioniert immer noch nicht richtig:

Intent myIntent = new Intent();
myIntent.setClassName("com.emergency.button", "com.emergency.button.EmergencyActivity");

8voto

ubershmekel Punkte 10402

Ok, ich bin mir nicht ganz sicher, was hier passiert ist, aber android:launchMode="singleInstance" in der Aktivität in AndroidManifest.xml hat das Problem irgendwie behoben.

    <activity android:name=".EmergencyActivity"
              android:launchMode="singleInstance"

@Octavian - Ich sollte klargestellt haben, dass ich die Aktivität von einem onReceive in einem AppWidgetProvider starte. Ich bin auf dem Startbildschirm und starte eine Aktivität mit dem Titel B, aber irgendwie sind sowohl A als auch B im Aktivitätsstapel, anstatt nur B.

http://developer.Android.com/guide/topics/manifest/activity-element.html#lmode

6voto

Pedro Loureiro Punkte 11320

Ich habe zwar noch nie Widgets verwendet, aber ich glaube, wenn Sie auf das Widget klicken, setzen Sie eine bestehende Aufgabe fort. Wenn Sie sich also in dieser Aufgabe befinden, kehren Sie zur letzten Aktivität in dieser Aufgabe zurück (statt zur Startseite).

Sehen Sie sich diesen Link an und wählen Sie den richtigen Startmodus für Ihr Widget http://developer.Android.com/guide/topics/fundamentals.html#lmodes

1voto

Octavian A. Damiean Punkte 39044

Das Verhalten ist nicht seltsam, sondern einfach die Art und Weise, wie Android funktioniert. Der Aktivitätsstapel behält einfach den Überblick über alle Aktivitäten. Wenn Sie nun eine Aktivität A starten, die eine andere Aktivität B startet, sieht Ihr Stapel wie (B, A) aus. Wenn Sie die Zurück-Taste drücken, wird Aktivität B aus dem Stapel entfernt und A wird wieder in den Vordergrund gebracht.

Die richtige Lösung besteht darin, einfach die finish() gleich nach dem Abfeuern der Intent .

0voto

Manchmal ist es aus bestimmten Gründen nicht möglich, launchMode singleInstance in einer Anwendung zu verwenden. In diesem Fall sollten Sie Ihre Aktivität starten und den Aktivitätsstapel löschen. Sie können dies mit Flags archivieren. Es gibt ein Beispiel:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X