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


253

Wenn Sie die Zurück-Taste drücken, möchte ich, dass meine Anwendung in den gestoppten Zustand und nicht in den zerstörten Zustand wechselt.

In den Android- Dokumenten heißt es:

... haben nicht alle Aktivitäten das Verhalten, dass sie zerstört werden, wenn BACK gedrückt wird. Wenn der Benutzer in der Musikanwendung mit der Musikwiedergabe beginnt und dann ZURÜCK drückt, überschreibt die Anwendung das normale Rückverhalten, verhindert, dass die Spieleraktivität zerstört wird, und spielt weiterhin Musik ab, 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 das Drücken der Zurück-Taste (wie unten) und rufen Sie dann die Methode (n) auf, die die Home-Taste 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 das Drücken der Zurück-Taste und fälschen Sie dann ein Drücken der Home-Taste.

  3. Erfassen Sie das Drücken der Zurück-Taste und starten Sie dann eine Aktivität des Startbildschirms, wodurch die Aktivität meiner Anwendung effektiv 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 Zustand und nicht in den zerstörten Zustand zu versetzen.


Antworten:


338

Meistens müssen Sie einen Dienst erstellen , um etwas im Hintergrund auszuführen, und Ihr Sichtbares Activitysteuert dies einfach Service. (Ich bin sicher, dass der Musik-Player auf die gleiche Weise funktioniert, daher scheint das Beispiel in den Dokumenten etwas irreführend zu sein.) Wenn dies der Fall ist, Activitykönnen Sie finishwie gewohnt und das Servicewird weiterhin ausgeführt.

Ein einfacherer Ansatz besteht darin, den BackTastendruck 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 sein, dass eine Aktivität normal beendet wird und sich selbst neu erstellen kann, z. B. bei Bedarf den aktuellen Status von einem Dienst lesen. Aber moveTaskToBackkann als schnelle Alternative gelegentlich verwendet werden.

HINWEIS : Wie von Dave unten ausgeführt, hat Android 2.0 eine neue onBackPressedMethode eingeführt und diese Empfehlungen zum Umgang mit der Schaltfläche Zurück.


1
moveTaskToBack () scheint wie gewünscht zu funktionieren. Was könnten die Nachteile dieser Methode sein? Gibt es Fälle, in denen dies möglicherweise nicht wie erwartet funktioniert?
Bdls

1
Nachdem ich das Dokument genauer gelesen habe, denke ich tatsächlich, dass es gut funktionieren sollte. (Ich dachte anfangs, dass es auf die Aktivität zutrifft, aber tatsächlich steht dort die "Aufgabe, die diese Aktivität enthält".) Aber Sie sollten es natürlich selbst testen. :)
Mirko N.

Dank Mirko scheint die Methode gut zu funktionieren. Es könnte cool sein, wenn Sie Ihrer Bearbeitung am Ende Ihrer Antwort für diejenigen, die sich diese Frage später ansehen, mehr Bedeutung beimessen - denn das war das, wonach ich gesucht habe!
Bdls

4
Bitte lesen Sie android-developers.blogspot.com/2009/12/…, um zu erfahren , wie Sie mit dem Zurück-Schlüssel umgehen können.
Hackbod

1
@bdls Theoretisch könnte Ihre Hintergrundaktivität vom System beendet werden, wenn die Ressourcen knapp werden. Um sicher zu gehen, sollte es sich trotzdem selbst neu erstellen können. Ich habe mir den Quellcode für die Android Music App angesehen und sehe keine spezielle Handhabung der Zurück-Schaltfläche.
Mirko N.

46

Verwenden Sie den folgenden Code:

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

23

Wenn Sie den Zurück-Button abrufen möchten, schauen Sie sich diesen Beitrag im Android Developer Blog an . Es behandelt den einfacheren Weg, dies in Android 2.0 zu tun, und den besten Weg, dies für eine Anwendung zu tun, die auf 1.x und 2.0 läuft.

Wenn Ihre Aktivität jedoch gestoppt wird, wird sie je nach Speicherverfügbarkeit auf dem Gerät möglicherweise trotzdem beendet. Wenn Sie möchten, dass ein Prozess ohne Benutzeroberfläche ausgeführt wird, sollten Sie eine erstellen Service. In der Dokumentation wird Folgendes zu Services angegeben:

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.



14

Wenn es jemand anderem hilft, hatte ich eine Aktivität mit 2 Layouts, die ich aus Gründen der Sichtbarkeit ein- und ausschaltete und versuchte, eine Art Struktur von Seite1> Seite2 zu emulieren. Wenn sie sich auf Seite 2 befanden und die Zurück-Taste drückten, wollte ich, dass sie zu Seite 1 zurückkehren. Wenn sie die Zurück-Taste auf Seite 1 drückten, sollte dies weiterhin wie gewohnt 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


10

Arbeitsbeispiel ..

Stellen Sie sicher, dass Sie nicht super.onBackPressed () aufrufen.

@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 Ihre Zurück-Taste wie die Home-Taste. Es beendet Ihre Aktivität nicht, sondern bringt sie in den Hintergrund

Zweiter Weg ist , rief moveTaskToBack(true);in onBackPressedund sicher sein , zu entfernensuper.onBackPressed


0

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 getötet wurde. Das Gegenstück zu onResume ().

Wenn Aktivität B vor Aktivität A gestartet wird, wird dieser Rückruf für A aufgerufen. B wird erst erstellt, wenn onPause () von A zurückgegeben wirdenter code here keine längeren aus.

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

Dies ist auch ein guter Ort, um Dinge wie Stoppanimationen und andere Dinge zu tun, die eine spürbare Menge an CPU verbrauchen, um so schnell wie möglich zur nächsten Aktivität zu wechseln oder um Ressourcen zu schließen, die exklusiven Zugriff haben, wie z. B. die Kamera.


0

Überschreiben Sie onBackPressed () nach Android 2.0. Sowie

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

0

Ich habe alle oben genannten Lösungen ausprobiert, aber keine davon hat für mich funktioniert. Der folgende Code hat mir geholfen, als ich versuchte, auf eine Weise zu MainActivity zurückzukehren, die onCreate aufruft:

Intent.FLAG_ACTIVITY_CLEAR_TOP ist der Schlüssel.

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

Ich habe @Mirko N. Antwort verwendet, indem ich den neuen benutzerdefinierten EditText erstellt habe

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

Stellen Sie dann Daten aus Ihrer Aktivität ein

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Danke dir.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.