Ich möchte wissen, ob der Benutzer zum Startbildschirm zurückkehren würde, wenn er die aktuelle Aktivität beendet.
Ich möchte wissen, ob der Benutzer zum Startbildschirm zurückkehren würde, wenn er die aktuelle Aktivität beendet.
Antworten:
UPDATE (Juli 2015):
Da getRunningTasks () veraltet erhalten, von API 21 ist es besser , folgen raukodraug Antwort oder Ed Burnette einen (I zweite würde es vorziehen).
Es besteht die Möglichkeit, aktuelle Aufgaben und deren Stapel mit ActivityManager zu überprüfen .
Um festzustellen, ob eine Aktivität die letzte ist:
Verwenden Sie den folgenden Code:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Bitte beachten Sie, dass der obige Code nur gültig ist, wenn Sie eine einzelne Aufgabe haben. Wenn die Möglichkeit besteht, dass für Ihre Anwendung eine Reihe von Aufgaben vorhanden sind, müssen Sie andere taskList- Elemente überprüfen . Lesen Sie mehr über Aufgaben Aufgaben und Back Stack
isTaskRoot()
Methode richtig machen .
Ich werde den Kommentar von @ H9kDroid als beste Antwort hier für Leute veröffentlichen, die eine ähnliche Frage haben.
Mit isTaskRoot () können Sie feststellen , ob die Aktivität die Wurzel einer Aufgabe ist.
ich hoffe das hilft
if (isTaskRoot()) { // do something }
Hoffe, dies wird neuen Anfängern helfen. Basierend auf den obigen Antworten, die für mich gut funktionieren, teile ich auch Code-Snippets, damit es einfach zu implementieren ist.
Lösung: Ich habe verwendet, isTaskRoot()
die true zurückgeben, wenn die aktuelle Aktivität nur eine Aktivität in Ihrem Stapel ist, und außer ich behandle auch den Fall, dass, wenn ich eine Aktivität im Stapel habe, zur letzten Aktivität im Stapel gehe, anstatt eine neue benutzerdefinierte zu öffnen .
In Ihrer Tätigkeit
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
Es gibt eine einfachste Lösung dafür. Sie können isTaskRoot () in Ihrer Aktivität verwenden
Es gibt zwar einen Weg, dies zu erreichen (siehe andere Antworten), aber ich würde vorschlagen, dass Sie das nicht tun sollten. Normale Android-Anwendungen sollten nicht wissen müssen, ob der Startbildschirm angezeigt wird oder nicht.
Wenn Sie versuchen, Daten zu speichern, fügen Sie den Datenspeichercode in Ihre onPause () -Methode ein. Wenn Sie versuchen, dem Benutzer eine Möglichkeit zu geben, seine Meinung über das Vorhandensein der Anwendung zu ändern, können Sie den Schlüssel für die Zurück-Taste und die onBackPressed () -Methode nach oben / unten abfangen und ihm ein "Sind Sie sicher?" prompt.
Eine Möglichkeit, dies zu verfolgen, besteht darin, beim Starten einer neuen Aktivität einen Marker einzuschließen und zu überprüfen, ob der Marker vorhanden ist.
Wenn Sie eine neue Aktivität starten, fügen Sie den Marker ein:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
Und Sie können dann so prüfen:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Das Problem bei der Verwendung der Lösung von sandrstar ActivityManager
lautet: Sie benötigen eine Berechtigung, um die Aufgaben auf diese Weise abzurufen . Ich habe einen besseren Weg gefunden:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Der Activity
untere Stapel sollte diese Kategorie standardmäßig erhalten, während andere Aktivitäten sie nicht erhalten sollten.
Aber selbst wenn dies auf einigen Geräten fehlschlägt, können Sie es einstellen, während Sie Folgendes starten Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Ich habe für alle meine Aktivitäten eine Basisklasse erstellt, die AppCompatActivity erweitert und über einen statischen Zähler verfügt:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Dies hat bisher gut genug funktioniert; und unabhängig von der API-Version. Es erfordert natürlich, dass alle Aktivitäten diese Basisklasse erweitern - was sie in meinem Fall tun.
Bearbeiten: Ich habe eine Instanz bemerkt, bei der der Zähler auf Null sinkt, bevor die App vollständig beendet wird. In diesem Fall wird die Ausrichtung geändert und nur eine Aktivität ist geöffnet. Wenn sich die Ausrichtung ändert, wird die Aktivität geschlossen und eine andere erstellt. Dies onDestroyed
wird für die letzte Aktivität onCreate
aufgerufen und wird dann aufgerufen, wenn dieselbe Aktivität mit der geänderten Ausrichtung erstellt wird. Dieses Verhalten muss berücksichtigt werden. OrientationEventListener könnte möglicherweise verwendet werden.
Android Geräte ein Activity - Stack, ich schlage vor , Sie darüber zu lesen hier . Es sieht so aus, als ob Sie nur die aufrufende Aktivität abrufen möchten : getCallingActivity()
. Wenn die aktuelle Aktivität die erste Aktivität in Ihrer Anwendung ist und die Anwendung über den Startbildschirm gestartet wurde, sollte sie (ich nehme an) zurückkehren null
.
Das einzige, was hier übersehen wurde, ist der Klick auf die "Home-Taste". Wenn diese Option aktiviert ist, können Sie dies nicht an Ihrer Aktivität erkennen. Daher ist es besser, den Aktivitätsstapel programmgesteuert zu steuern, indem Sie die Taste "Zurück" drücken und zur gewünschten Aktivität wechseln oder nur die notwendigen Schritte machen.
Darüber hinaus können Sie nicht sicher sein, ob das Starten Ihrer Aktivität aus der Liste "Letzte Aktivität" erkannt werden kann, indem einige zusätzliche Daten in die Absicht zum Öffnen der Aktivität voreingestellt werden, da diese in diesem Fall wiederverwendet werden.