2010-01-04 5 views
232

Wenn ich die Zurück-Taste drücke, möchte ich, dass meine Anwendung in den angehaltenen Zustand und nicht in den zerstörten Zustand übergeht.Schaltfläche "Zurück", um wie "Home" zu fungieren

Im Android docs heißt es:

... nicht alle Aktivitäten das Verhalten haben, dass sie zerstört werden, wenn BACK gedrückt wird. Wenn der Benutzer beginnt, Musik in der Musikanwendung zu spielen und drückt dann BACK, überschreibt die Anwendung das normale Rück Verhalten, von der Spieler-Aktivität verhindert wird zerstört, und weiterhin Musik zu spielen, obwohl seine Tätigkeit nicht mehr sichtbar ist

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

denke ich es drei Möglichkeiten sein muss ...

  1. Aufnahme die Zurück-Taste drücken (wie unten) und rufen Sie dann eine beliebige Methode (n) die Home-Taste Anrufe.

    @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. Aufnahme der Zurück-Taste drücken und dann eine Home-Taste drücken fälschen.

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

Edit: Ich weiß, über Dienstleistungen und ist mit einer in der Anwendung, auf denen dieses Problem in Zusammenhang steht. Bei dieser Frage geht es speziell darum, die Aktivität beim Drücken der Zurück-Schaltfläche in den angehaltenen Zustand zu versetzen und nicht in den zerstörten Zustand.

+0

sehen eine ähnliche Antwort http://stackoverflow.com/questions/5914040/onbackpressed-to-hide-not-destroy-activity/23759328#23759328 – Nepster

Antwort

324

Meistens müssen Sie einen Service erstellen, um etwas im Hintergrund auszuführen, und Ihr sichtbarer Activity steuert einfach diesen Service. (Ich bin mir sicher, dass der Music Player auf die gleiche Weise funktioniert, daher scheint das Beispiel in der Dokumentation ein wenig irreführend zu sein.) Wenn das der Fall ist, kann Ihre Activity wie gewohnt finish und die Service wird noch ausgeführt.

Ein einfacher Ansatz ist es, die Back Taste drücken zu erfassen und moveTaskToBack(true) rufen Sie wie folgt vor:

// 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 sein sollte für eine Aktivität normal zu beenden und in der Lage sein, sich selbst neu erstellen z.B. Lesen des aktuellen Status von einem Dienst, falls erforderlich. Aber moveTaskToBack kann gelegentlich als schnelle Alternative verwendet werden.

HINWEIS: wie von Dave unter Android 2.0 führte ein neues Verfahren onBackPressed und these recommendations, wie die Schaltfläche Zurück zu handhaben hingewiesen.

+1

moveTaskToBack() wird, wie gewünscht zu arbeiten. Was könnten die Nachteile dieser Methode sein? Gibt es Fälle, in denen dies nicht wie erwartet funktioniert? – bdls

+1

Nachdem ich seinen Doc genauer gelesen habe, denke ich, dass es gut funktionieren sollte. (Ich dachte zunächst, dass es sich auf die Aktivität bezieht, aber tatsächlich sagt es die "Aufgabe, die diese Aktivität enthält".) Aber Sie sollten es natürlich selbst testen. :) –

+0

Dank Mirko scheint die Methode gut zu funktionieren. Es könnte cool sein, wenn du deine Bearbeitung am Ende deiner Antwort für diejenigen auffällest, die diese Frage später betrachten - denn das war das, wonach ich gesucht habe! – bdls

22

Wenn Sie die Zurück-Taste fangen möchten, werfen Sie einen Blick auf this post on the Android Developer Blog. 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 ist, wird sie abhängig von der 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 Service erstellen. The documentation says the following about Services:

Ein Dienst hat keine visuelle Benutzeroberfläche, sondern läuft im Hintergrund auf unbestimmte Zeit. Zum Beispiel könnte ein Dienst Hintergrundmusik abspielen, während der Benutzer sich um andere Angelegenheiten kümmert, oder er könnte Daten über das Netzwerk abrufen oder etwas berechnen und das Ergebnis für Aktivitäten bereitstellen, die es benötigen.

Diese scheint für Ihre Anforderungen geeignet.

17

versuchen, die in der Klasse android.app.Activity definierte Variable onBackPressed() zu überschreiben.

+1

seit Android 2.0 ist dies die richtige Sache zu überschreiben. http://developer.android.com/sdk/android-2.0.html – jay

+2

16 upvotes für eine Antwort so ... 2011 war eine andere Zeit ... – GabrielOshiro

13

Wenn es jemand anderem hilft, hatte ich eine Aktivität mit 2 Layouts, die ich ein- und ausgeschaltet habe, um eine Art page1> page2 Struktur zu emulieren. wenn sie auf Seite 2 waren und die Zurück-Taste gedrückt haben, wollte ich, dass sie auf Seite 1 zurückgehen. Wenn sie die Zurück-Taste auf Seite 1 drücken, sollte sie 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 
    } 

} 

hoffen, dass es jemand, prost

-1

hilft habe ich @Mirko N. verwenden answser die neue benutzerdefinierte EditText

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); 
    } 

} 

Dann setzen Sie Daten, die unter Verwendung von Ihrem Aktivität

searchEditView.setViews(cancelBtn, titleRelativeLayout); 

Vielen Dank.

42

Verwenden Sie den folgenden Code ein:

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

noch besser, wie etwa OnPause():

Genannt als Teil der Aktivität Lebenszyklus, wenn eine Aktivität in den Hintergrund geht, hat aber (noch) nicht gewesen getötet. Das Gegenstück zu onResume().

Wenn Aktivität B vor Aktivität A gestartet wird, wird dieser Rückruf auf A aufgerufen. B wird erst erstellt, wenn A's onPause() zurückgibt, also stellen Sie sicher, dass enter code here hier nicht lange dauert.

Dieser Rückruf wird hauptsächlich zum Speichern aller persistenten Zustände verwendet, die 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 zuerst zu löschen.

Dies ist auch ein guter Ort, um Dinge wie stoppen Animationen und andere Dinge, die eine merkliche Menge an CPU verbrauchen, um den Wechsel zur nächsten Aktivität so schnell wie möglich zu machen, oder Ressourcen schließen, die exklusiven Zugriff wie sind wie die Kamera.

8

Arbeitsbeispiel ..

stellen Sie sicher, rufen Sie nicht super.onBackPressed();

@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 Home-Taste.Es spielt endet nicht Ihre Tätigkeit, sondern bringen Sie es zum Hintergrund

Zweiter Weg moveTaskToBack(true); in onBackPressed zu nennen ist und sicher sein, super.onBackPressed

0

Aufschalten onBackPressed() nach Android 2.0 zu entfernen. Wie

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