wake-up-neo.com

Überschreiben Sie die Zurück-Taste, um sich wie die Home-Taste zu verhalten

Beim Drücken der Zurück-Taste möchte ich, dass meine Anwendung in den gestoppten und nicht in den zerstörten Zustand versetzt wird.

In Android docs heißt es:

... nicht alle Aktivitäten haben das Verhalten, dass sie beim Drücken von BACK zerstört werden. Wenn der Benutzer mit der Musikwiedergabe in der Musikanwendung beginnt und dann die Taste ZURÜCK drückt, setzt die Anwendung das normale Verhalten der Wiedergabe außer Kraft, um zu verhindern, dass die Playeraktivität zerstört wird, und setzt die Musikwiedergabe fort, obwohl ihre Aktivität nicht mehr sichtbar ist

Wie repliziere ich diese Funktionalität in meiner eigenen Anwendung?

Ich denke, es muss drei Möglichkeiten geben ...

  1. Erfassen Sie den Zurück-Knopfdruck (wie unten) und rufen Sie dann die Methoden auf, die der Home-Knopf aufruft.

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
    
  2. Erfassen Sie den Zurück-Knopfdruck und fälschen Sie dann den Home-Knopfdruck.

  3. Erfassen Sie den Zurück-Knopfdruck und starten Sie dann eine Aktivität auf dem Startbildschirm, wodurch die Aktivität meiner Anwendung in den gestoppten Zustand versetzt wird.

Bearbeiten: Ich kenne mich mit Diensten aus und verwende einen in der Anwendung, mit der dieses Problem zusammenhängt. Bei dieser Frage geht es speziell darum, die Aktivität beim Drücken der Zurück-Taste in den gestoppten und nicht in den zerstörten Zustand zu versetzen.

244
bdls

Meistens müssen Sie ein Service erstellen, um etwas im Hintergrund auszuführen, und Ihr sichtbares Activity steuert einfach dieses Service. (Ich bin sicher, der Music Player funktioniert auf die gleiche Art und Weise, so dass das Beispiel in den Dokumenten etwas irreführend erscheint.) Wenn dies der Fall ist, kann Ihr Activity wie gewohnt finish und der Service wird weiterhin ausgeführt.

Ein einfacherer Ansatz besteht darin, den Druckknopf Back zu erfassen und moveTaskToBack (true) wie folgt aufzurufen:

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Ich denke, die bevorzugte Option sollte darin bestehen, dass eine Aktivität normal beendet wird und sich selbst neu erstellen kann, z. Lesen des aktuellen Status von einem Service, falls erforderlich. Aber moveTaskToBack kann gelegentlich als schnelle Alternative verwendet werden.

[~ # ~] Anmerkung [~ # ~] : wie von Dave unten ausgeführt Android= 2.0 führte eine neue ein onBackPressed -Methode und diese Empfehlungen zur Behandlung der Schaltfläche Zurück.

333
Mirko N.

Verwenden Sie den folgenden Code:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
44

Wenn Sie den Zurück-Button abfangen möchten, lesen Sie dieser Beitrag im Android Developer Blog . Er beschreibt den einfacheren Weg, dies in Android 2.0 und der beste Weg, dies für eine Anwendung zu tun, die auf 1.x und 2.0 ausgeführt wird.

Wenn Ihre Aktivität jedoch gestoppt wird, wird sie möglicherweise trotzdem beendet, abhängig von der Verfügbarkeit von Speicher auf dem Gerät. Wenn ein Prozess ohne Benutzeroberfläche ausgeführt werden soll, müssen Sie ein Service erstellen. In der Dokumentation steht Folgendes zu Services:

Ein Dienst verfügt nicht über eine visuelle Benutzeroberfläche, sondern wird auf unbestimmte Zeit im Hintergrund ausgeführt. Beispielsweise kann ein Dienst Hintergrundmusik abspielen, während sich der Benutzer um andere Angelegenheiten kümmert, oder er kann Daten über das Netzwerk abrufen oder etwas berechnen und das Ergebnis für Aktivitäten bereitstellen, die dies benötigen.

Diese scheinen für Ihre Anforderungen angemessen zu sein.

22
Dave Webb

versuchen Sie, void onBackPressed() zu überschreiben, das in der Android.app.Activity-Klasse definiert ist.

17
m-szalik

wenn es jemand anderem hilft, hatte ich eine Aktivität mit 2 Layouts, die ich aus Gründen der Sichtbarkeit ein- und ausschaltete, um eine Art von page1> page2-Struktur zu emulieren. Wenn sie auf Seite 2 waren und den Zurück-Knopf drückten, wollte ich, dass sie zu Seite 1 zurückkehren. Wenn sie den Zurück-Knopf auf Seite 1 drückten, sollte es immer noch normal funktionieren. Es ist ziemlich einfach, aber es funktioniert

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

hoffe es hilft jemandem, Prost

13
craigk

Arbeitsbeispiel ..

Rufen Sie nicht super.onBackPressed () auf.

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

Auf diese Weise verhält sich Ihr Zurück-Button wie der Home-Button. Es beendet Ihre Aktivität nicht, sondern führt sie in den Hintergrund

Die zweite Möglichkeit besteht darin, moveTaskToBack(true); in onBackPressed aufzurufen und super.onBackPressed Zu entfernen.

9
Xar E Ahmer

Noch besser, wie wäre es mit OnPause () :

Wird als Teil des Aktivitätslebenszyklus aufgerufen, wenn eine Aktivität in den Hintergrund tritt, aber (noch) nicht beendet wurde. Das Gegenstück zu onResume ().

Wenn die Aktivität B vor der Aktivität A gestartet wird, wird dieser Rückruf für A aufgerufen. B wird erst erstellt, wenn die Funktion onPause () von A zurückgegeben wird. Stellen Sie also sicher, dass toenter code here hier nichts langes tun.

Dieser Rückruf wird hauptsächlich verwendet, um einen permanenten Status zu speichern, den die Aktivität bearbeitet, und um sicherzustellen, dass nichts verloren geht, wenn nicht genügend Ressourcen zum Starten der neuen Aktivität vorhanden sind, ohne diese zuvor zu beenden.

Dies ist auch ein guter Ort, um Animationen zu stoppen und andere Dinge zu erledigen, die spürbar viel CPU verbrauchen, um so schnell wie möglich zur nächsten Aktivität zu wechseln oder um Ressourcen zu schließen, auf die ausschließlich zugegriffen werden kann, wie z. B. die Kamera.

0
user1524315

Überschreiben Sie onBackPressed () nach Android 2.0. Wie

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
0
SaiLiu