2013-12-15 13 views
35

In meiner Anwendung i verlassen app wenn Zurück-Taste drücken wollen, dies ist mein Code:Android: Beenden Anwendung, wenn Zurück-Taste drücken

@Override 
    public void onBackPressed() { 
     new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit") 
       .setMessage("Are you sure you want to exit?") 
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         finish(); 
        } 
       }).setNegativeButton("No", null).show(); 
    } 

es richtig funktioniert, aber wenn ich verlassen app es nicht vollständig verlassen und Zeige leere Seite mit meinem App-Logo und wenn ich wieder zurück drücke Button aus der App, Wie kann ich es reparieren ???

EDIT:

ich diesen Code verwenden anstelle von oben, aber meine app Ausfahrt vollständig, aber ich möchte es im Hintergrund läuft und verlassen nicht vollständig, wie kann ich es tun?

@Override 
    public void onBackPressed() { 
     new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit") 
       .setMessage("Are you sure?") 
       .setPositiveButton("yes", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 

         Intent intent = new Intent(Intent.ACTION_MAIN); 
         intent.addCategory(Intent.CATEGORY_HOME); 
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(intent); 
         finish(); 
        } 
       }).setNegativeButton("no", null).show(); 
    } 
+0

Sie haben keinen Kompilierfehler für diesen Code? – LightYearsBehind

Antwort

97

Wenn Sie zurück drücken und dann Ihre aktuelle Aktivität beenden (sagen A), sehen Sie eine leere Aktivität mit Ihrem App-Logo (B), das bedeutet einfach, dass Aktivität B, die nach dem Beenden von A angezeigt wird, noch im Backstack ist und die Aktivität A wurde auch von Aktivität B, so in Aktivität gestartet, Sie sollten Aktivität A mit Fahnen als

Intent launchNextActivity; 
launchNextActivity = new Intent(B.class, A.class); 
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);     
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
startActivity(launchNextActivity); 

Jetzt ist Ihre Aktivität A ist oben auf dem Stapel keine anderen Aktivitäten Ihrer Anwendung auf dem Backstack starten.

Jetzt in der Aktivität A, wo Sie onBackPressed schließen die App implementieren mögen, können Sie etwas tun,

private Boolean exit = false; 
@Override 
    public void onBackPressed() { 
     if (exit) { 
      finish(); // finish activity 
     } else { 
      Toast.makeText(this, "Press Back again to Exit.", 
        Toast.LENGTH_SHORT).show(); 
      exit = true; 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        exit = false; 
       } 
      }, 3 * 1000); 

     } 

    } 

Der Handler hier ein versehentlichen zurück drücken Griffe, es ist einfach ein Toast zeigt, und wenn es gibt noch einen weiteren Druck innerhalb von 3 Sekunden, es schließt die Anwendung.

+0

Ich weiß nur nicht, was ist "NEXT_ACTIVITY" in meiner App, ich füge meinen Code in Aktivität, die ich möchte Exit-Taste funktioniert auf dieser Seite, aber in Ihrem Code Ich weiß nicht, welche meine Seite wird NEXT_ACTIVITY. –

+0

Danke! es funktionierte! – mboy

+0

Elegant. Ich bin mir nicht sicher, was Home ist. Entfernen Sie es einfach und links beenden(); – samleighton87

0

Statt finish() Anruf super.onBackPressed()

+0

@Shasika: Was du gesagt hast, ist nicht wahr, es ist nicht wahr, dass eine Methode darin aufgerufen wird, ich kann nicht BackPressed() darin aufrufen !!! –

5

Es bedeutet, dass Ihre frühere Tätigkeit im Stapel, wenn Sie diese Aktivität starten. Fügen Sie nach der Zeile, in der Sie diese Aktivität aufrufen, finish(); hinzu.

In Ihrer bisherigen Aktivität. Wenn Sie eine neue Aktivität starten, wie-

startActivity(I); 

Fügen Sie danach finish(); hinzu.

1

Fertig stellen schließt die App nicht, es schließt nur die Aktivität. Wenn dies die Launcher-Aktivität ist, wird Ihre App geschlossen. Wenn nicht, wird auf die vorherige Aktivität zurückgegriffen.

Sie können onActivityResult verwenden, um so viele finish() wie nötig auszulösen, um alle offenen Aktivitäten zu schließen. diese

+0

Bitte überprüfen Sie Bearbeiten, ich möchte, wenn ich meine App schließe Es läuft im Hintergrund, wie kann ich es tun? –

+0

@ElhamGdz können Sie bitte Ihren Satz umformulieren? Ich kann dich nicht verstehen. Wenn Sie den Aktivitätslebenszyklus überprüfen, gibt es keinen Status, der im Hintergrund ausgeführt wird und ausgeführt wird oder nicht ausgeführt wird. http://developer.android.com/training/basics/activity-lifecycle/index.html. Wenn Sie Code auf dem Hintergrund ausführen möchten, benötigen Sie möglicherweise ein Async oder (als letzte Option) einen Dienst http://developer.android.com/reference/android/app/Service.html – gian1200

41

Versuchen:

Intent intent = new Intent(Intent.ACTION_MAIN); 
      intent.addCategory(Intent.CATEGORY_HOME); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here*** 
      startActivity(intent); 
      finish(); 
      System.exit(0); 
+0

Das funktioniert ziemlich gut für mich, danke. –

+0

Danke! Es führt einen Neustart ohne 'System.exit (0);' –

+0

Schlechte Praxis, Anwendung von zu Hause Schaltfläche zu töten, und System.exit (0); Wir müssen die System-Kill-Anwendung behalten, nachdem wir auf die Zurück-Schaltfläche in der letzten Aktivität geklickt haben. –

-5

Mit diesem Code sehr einfache Lösung

@Override 
    public void onBackPressed() { 
     super.onBackPressed(); // this line close the app on backpress 
} 
+3

Was ist der Zweck, eine Methode zu überschreiben und nur eine Super-Implementierung aufzurufen? – pskink

+0

Falsche Antwort. 'super.onBackPressed()' beendet die App nur, wenn dies die root-Aktivität ist. Außerdem, warum überschreiben, wenn Sie nichts tun, aber rufen "Super"? – Pang

1

Diese Arbeit für mich.Ich kann es mir selbst gefunden durch andere Antworten Kombination

private Boolean exit = false; 
@override 
public void onBackPressed(){ 
    if (exit) { 
     finish(); // finish activity 
    } 
    else { 
     Toast.makeText(this, "Press Back again to Exit.", 
      Toast.LENGTH_SHORT).show(); 
     exit = true; 
     new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      Intent a = new Intent(Intent.ACTION_MAIN); 
      a.addCategory(Intent.CATEGORY_HOME); 
      a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(a); 
     } 
    }, 1000); 
} 
12

Ich hatte das gleiche Problem habe ich ein LoginActivity und ein MainActivity. Wenn ich in MainActivity auf die Zurück-Schaltfläche klicke, muss die Anwendung geschlossen werden. SO tat ich mit OnBackPressed-Methode. Diese moveTaskToBack() funktioniert genauso wie die Home-Schaltfläche. Es verlässt den Back-Stack wie es ist.

+1

großartig! Danke –

3

In meinem Verständnis will Google, dass Android die Speicherverwaltung übernimmt und die Apps herunterfährt. Wenn Sie die App über den Code beenden müssen, ist es möglicherweise von Vorteil, Android zu bitten, den Garbage Collector auszuführen. Nohistory = "true" in manifest

@Override 
public void onBackPressed(){ 
    System.gc(); 
    System.exit(0); 
} 

Sie können auch finish(), um den Code hinzufügen, aber es ist wahrscheinlich überflüssig, wenn Sie auch System.exit (0)

+0

App startet nur neu nach diesem Codeblock –

1

niemand empfohlen zu haben scheint tun .xml, um zu verhindern, dass bestimmte Aktivitäten nach dem Drücken der Zurück-Taste angezeigt werden, die standardmäßig die Methodenmethode finish() verwendet

Verwandte Themen