2014-12-08 16 views
5

Ich würde meine App beenden und sie aus der Liste der letzten Aufgabe abbrechen.finishAndRemoveTask() verfügbar auf API 21

finishAndRemoveTask() ist nur auf API 21.

Was sollte ich auf API verwenden weniger als 21 ??

+0

Ich glaube nicht, dass es so eine einfache Möglichkeit gibt, dies in niedrigeren API-Ebenen zu tun, aber ... warum sollte jemand das tun wollen? – thelawnmowerman

+0

Ich möchte verhindern, dass der Benutzer die App von der letzten Aufgabe wieder öffnet. – user3253955

+0

Wenn Sie gerade alle Ihre Aktivitäten abgeschlossen haben, wird Ihre App immer noch in der letzten Aufgabenliste angezeigt? Haben Sie versucht, alle Ihre Aktivitäten mit einer Absicht mit Flaggen zu beenden? – thelawnmowerman

Antwort

3

eine Absicht zur ersten Aktivität im Stapel Stellen und die aktuelle Aktivität beenden:

Intent intent = new Intent(this, FirstActivity.class); 
intent.putExtra(EXTRA_FINISH, true); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
startActivity(intent); 
finish(); 

Und in der onResume Methode der FirstActivity, so etwas wie dies die letzte Aktivität im Stapel zu beenden (und hoffentlich die App aus der Liste der letzten Apps entfernen):

+0

Dies würde in einem sehr speziellen Anwendungsfall funktionieren, in dem 'FirstActivity' die einzige Aktivität im Stapel ist und es die einzige Instanz dieser Aktivität in dieser Task ist und die Task nicht von kürzlich ausgeführten Tasks entfernt wird. Mit anderen Worten, das hat keine ähnliche Wirkung wie 'finishAndRemoveTask' –

+0

Ich stimme zu, es ist ein sehr spezifischer Anwendungsfall, aber zum Glück ist es auch der am häufigsten verwendete. Es gibt viele einfachere Apps mit einer einzigen Launcher-/Menüaktivität als komplexere Flüsse. Korrektur: das hat einen * ähnlichen * Effekt wie 'finishAndRemoveTask', natürlich nicht den * selben (und, wie du sehen kannst, wurden keine anderen Vorschläge gemacht, also ist es das Beste, was wir jetzt haben). Der Rest Ihrer Analyse ist falsch: Viele Aktivitäten können dank des Flags FLAG_ACTIVITY_CLEAR_TOP im Stapel und sogar in vielen Instanzen von ihnen liegen. Wie auch immer und am wichtigsten: Dies ist nur ein Workaround für Legacy-Geräte. – thelawnmowerman

+0

endet nicht nur die aktuelle Aktivität zu schließen. in diesem Fall Erste Aktivität. –

0

Ich hatte einen ähnlichen Anwendungsfall wo ich alle Aktivitäten beenden musste. Hier ist eine Möglichkeit, dies ohne finishAndRemoveTask() zu tun.

Machen Sie alle Ihre Aktivitäten eine Basisklasse mit folgenden Dinge in ihm verlängern:

private Boolean mHasParent = false; 

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

    Intent intent = getIntent(); 
    Bundle extras = intent.getExtras(); 
    if (extras != null) { 
     mHasParent = extras.getBoolean("hasParent", false); 
    } 
} 

// Always start next activity by calling this. 
protected void startNextActivity(Intent intent) { 
    intent.putExtra("hasParent", true); 
    startActivityForResult(intent, 199); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if (requestCode == 199 && resultCode == FINISH_ALL) { 
     finishAllActivities(); 
    } 
} 

protected void finishAllActivities() { 
    if (mHasParent) { 
     // Return to parent activity. 
     setResult(FINISH_ALL); 
    } else { 
     // This is the only activity remaining on the stack. 
     // If you need to actually return some result, do it here. 
     Intent resultValue = new Intent(); 
     resultValue.putExtra(...); 
     setResult(RESULT_OK, resultValue); 
    } 

    finish(); 
} 

einfach finishAllActivities() in jeder Tätigkeit nennen, und alle Aktivitäten entspannen wird. Natürlich, wenn es Ihnen egal ist, welches Ergebnis die letzte Aktivität zurückgibt, kann der Code viel einfacher gemacht werden.

Verwandte Themen