Wie verlasse ich die Anwendung und zeige den Startbildschirm?


195

Ich habe eine Anwendung, in der ich auf der Startseite Schaltflächen zur Navigation durch die Anwendung habe.

Auf dieser Seite habe ich eine Schaltfläche "BEENDEN", ​​die den Benutzer beim Klicken zum Startbildschirm des Telefons führen soll, auf dem sich das Anwendungssymbol befindet.

Wie kann ich das machen?

Antworten:


326

Das Design von Android bevorzugt nicht das Beenden einer Anwendung nach Wahl, sondern verwaltet sie vom Betriebssystem. Sie können die Home-Anwendung mit der entsprechenden Absicht aufrufen:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

25
Sie können sogar .. "moveTaskToBack (true);"
Hemanth Kumar

17
Wird es alle Ressourcen freigeben? Denn wenn ich die App auf diese Weise beende und nach einiger Zeit wieder auf das App-Symbol klicke. Es beginnt dort, wo ich es verlassen habe. Das heißt, die App lief noch im Hintergrund.
Adil Malik

12
Activity.finish ();
hB0

11
Dadurch bleibt Ihre App im Hintergrund, sodass die Anwendung nicht beendet wird.
Herman Schönfeld

3
Diese Antwort lässt nur den Startbildschirm erscheinen und beendet / schließt die Anwendung nicht vollständig, wie es das OP wünscht.
Basher51

74

Vielleicht können Sie so etwas ausprobieren

Angenommen, wir haben in unserer Anwendung eine Reihe von Aktivitäten (z. B. zehn) und müssen diese Aktivität direkt beenden. Was wir tun können, ist, eine Absicht zu erstellen und zur Stammaktivität zu gehen und das Flag in der Absicht als zu setzen

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Fügen Sie der Absicht auch etwas mehr wie Boolesches hinzu

intent.putExtra("EXIT", true);

Überprüfen Sie dann in der Root-Aktivität den Wert von booleanund gemäß diesem Aufruf finish () in onCreate()der Root-Aktivität

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}

1
Tun Sie einfach nichts in onCreate, um finish aufzurufen.
Imcaptor

2
In meinem Fall musste ich auch überschreiben onNewIntent. Weil intnet.getExtras () weiterhin null war.
zznq

Und diese Methode startet Ihren neu, RootActivityanstatt ihn vom Stapel fortzusetzen. Überprüfen Sie hier, um diesen stackoverflow.com/a/26258455/609782
Darpan

28
System.exit(0);

Ist wahrscheinlich das, wonach Sie suchen. Dadurch wird die gesamte Anwendung geschlossen und Sie gelangen zum Startbildschirm.


1
Sollte das ein Ausgang in Kleinbuchstaben sein?
Carol

1
sollte System.exit (0) sein. Aber es ist trotzdem nicht sehr nützlich.
Superarts.org

7
System.exit (0) sollte nicht wie vom Android-Kernteam empfohlen verwendet werden.
Dinesh Venkata

2
Ich denke, dies ist der beste Ansatz für außergewöhnliche Umstände. Sagen wir für eine App, die Internet benötigt und die Verbindung bricht ein paar Aktivitäten in die App. Ein Warndialog kann angezeigt werden (ohne Schaltflächen). Die Schaltfläche Zurück muss die gesamte App beenden, da für den Wiedereintritt erneut eine Anmeldung / Initialisierung erforderlich ist. System.exit ist das einzige, was vernünftigerweise funktioniert, was ich gefunden habe. Ich bin mir jedoch nicht sicher über den Kommentar @ user1699548.
Herman Schönfeld

1
Tötet dies auch alle Dienste, die mit dieser App zusammenhängen?
Bsara

25

Das funktioniert gut für mich.
Schließen Sie alle vorherigen Aktivitäten wie folgt:

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

Fügen Sie dann in der Methode MainActivity onCreate () diese hinzu, um die MainActivity zu beenden

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }

Das funktioniert bei mir nicht. Es lässt meine App mit nichts sichtbar, läuft aber immer noch wie. Ich kann Threads im Debugger herumhängen und warten sehen, die eigentlich nie etwas bewirken.
Stephen M-auf Streik-

23

Beenden Sie zuerst Ihre Anwendung mit der Methode finish();

und fügen Sie dann die folgenden Zeilen in onDestroy hinzu, um Force Close zu entfernen

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

3
Verwenden Sie dies niemals, da es keine Chance gibt, Ressourcen
freizugeben

1
-1, da onDestroy immer dann ausgeführt wird, wenn Sie die Aktivität verlassen, nicht nur, wenn die Zurück-Taste gedrückt wird.
Hamzeh Soboh

5
@Jacky: und wie werden durch das Beenden des Prozesses keine Systemressourcen freigesetzt?
Herman Schönfeld

1
Warum ist das super.onDestroy()nach dem killProcess()? würde diese Linie überhaupt erreicht werden?
Shoosh

Tötet dies nicht auch alle Ihre Dienste?
Irshu

20

Wenn Sie eine Aktivität beenden möchten, können Sie einfach anrufen finish(). Es ist jedoch eine schlechte Praxis, eine Exit-Schaltfläche auf dem Bildschirm zu haben.


2
Ich verwende es für "Sie müssen diese App auf die neueste Version aktualisieren" und möchte nicht, dass sie sie weiterhin verwenden. Immer noch schlechte Praxis ...?
Beetree

@ Beetree Ja. Wie bei jeder schlechten Praxis gibt es Fälle, in denen dies Ihre einzige Option ist und Sie sie verwenden, weil der Versuch, etwas anderes zu tun, unsinnig wäre. Der Grund dafür, dass es im Gegensatz zur illegalen Syntax eine schlechte Praxis ist , ist, dass es für diese wenigen Fälle verfügbar ist, aber Sie sollten Ihr Bestes geben, um einen besseren Weg zu finden, dies zu tun. In Ihrem Fall gibt es keinen.
Fund Monica Klage

17

Einige Aktivitäten möchten Sie eigentlich nicht wieder öffnen, wenn Sie die Zurück-Taste drücken, z. B. Begrüßungsbildschirm-Aktivität, Begrüßungsbildschirm-Aktivität, Bestätigungsfenster. Eigentlich brauchen Sie das nicht im Aktivitätsstapel. Sie können dies tun, indem Sie die Datei => open.xml öffnen und ein Attribut hinzufügen

android: noHistory = "wahr"

zu diesen Aktivitäten.

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

ODER

Manchmal möchten Sie die gesamte Anwendung durch Drücken einer bestimmten Zurück-Taste schließen. Hier wird empfohlen, das Startfenster zu öffnen, anstatt die Anwendung zu beenden. Dazu müssen Sie die onBackPressed () -Methode überschreiben. Normalerweise öffnet diese Methode die oberste Aktivität im Stapel.

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

ODER

Wenn Sie die Zurück-Taste gedrückt haben, möchten Sie diese Aktivität beenden und diese auch nicht zum Aktivitätsstapel hinzufügen. Rufen Sie die Methode finish () in der Methode onBackPressed () auf. Es wird nicht die gesamte Anwendung geschlossen. Es wird für die vorherige Aktivität im Stapel gehen.

@Override
public void onBackPressed() {
  finish();
}

16

Es wird nicht empfohlen, Ihre Android-Anwendung zu beenden. Siehe diese FrageWeitere Informationen finden .

Der Benutzer kann Ihre App jederzeit über die Home-Taste oder in der ersten Aktivität über die Zurück-Taste beenden.


3
@janusz: Drücken Sie die Home-Taste nie beenden Android-Anwendung, stattdessen geht es in den Hintergrund ...
Jayesh

5

(Ich habe frühere Antworten ausprobiert, aber sie fehlen in einigen Punkten. Wenn Sie beispielsweise return;nach Abschluss der Aktivität keine ausführen, wird der verbleibende Aktivitätscode ausgeführt. Außerdem müssen Sie onCreate mit return bearbeiten. Wenn Sie super.onCreate () nicht ausführen.) Sie erhalten einen Laufzeitfehler.

Sagen Sie, Sie haben MainActivityund ChildActivity.

Fügen Sie in ChildActivity Folgendes hinzu:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

Fügen Sie in onCreate von MainActivity Folgendes hinzu:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}


3

Wenn Sie finish onDestroy () dieser Aktivität aufrufen, wird diese aufgerufen und es wird zur vorherigen Aktivität im Aktivitätsstapel zurückgekehrt ... Rufen Sie zum Beenden nicht finish () auf.


3

Folgendes habe ich getan:

SomeActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

Grundsätzlich haben Sie alle Aktivitäten vom Stapel gelöscht und gestartet QuitAppActivity, um die Aufgabe zu beenden.


Guter Ansatz. Es ist nicht erforderlich, Werte über Intent zu übergeben.
user3144836

0

Fügen Sie nach finish();in folgende Zeilen hinzu onDestroy():

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

0

Ich habe versucht, die Anwendung mit dem folgenden Code-Snippet zu beenden. Dies hat bei mir funktioniert. Hoffe das hilft dir. Ich habe eine kleine Demo mit 2 Aktivitäten gemacht

erste Aktivität

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

Ihre andere Aktivität

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

0

Ich habe es im Beobachtermodus gemacht.

Beobachterschnittstelle

public interface Observer {
public void update(Subject subject);
}

Basisthema

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

Untergeordnetes Subjekt implementiert die Exit-Methode

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

MyApplication, die Ihre Anwendung erweitern soll

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}}

Basisaktivität

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

Lass es uns testen

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

Wenn Sie die Anwendung beenden möchten, fügen Sie diesen Code unter Ihre Funktion ein

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}

0

100% funktioniert gut. Dies ist der Code zum Beenden Ihrer App onClick (Methode)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

0

Sie können einfach moveTaskToBack(true)Ihre Exit-Schaltflächen hinzufügenonClickedListener um die Anwendung zu minimieren.

Ich hoffe es hilft.


0

Vielleicht kann mein Code hepls (Main_Activity.java):

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

Wenn Sie Ihre Anwendung beenden möchten. Verwenden Sie dann diesen Code in Ihrem Ereignis mit gedrückter Taste. mögen:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
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.