New Intent () startet neue Instanz mit Android: launchMode = „singleTop“
-
19-09-2019 - |
Frage
Ich habe Aktivität A
mit android:launchMode="singleTop"
im Manifest.
Wenn ich gehe zu Aktivität B
, C
und D
da habe ich Menü-Verknüpfungen auf meine Anwendungen Wurzelaktivität zurückzukehren (A
).
Der Code sieht wie folgt aus:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
Doch statt auf die bereits vorhandene Instanz A
meine MainActivity.class
Rückkehr es eine neue Instanz erstellt -> es geht statt onCreate()
onNewIntent()
Dies ist nicht das erwartete Verhalten, nicht wahr?
Lösung
Dies sollte den Trick tun.
<activity ... android:launchMode="singleTop" />
Wenn Sie eine Absicht erstellen die App nutzen zu starten:
Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Dies ist das sollte erforderlich sein.
Andere Tipps
Was für mich tatsächlich arbeitete am Ende war:
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
Zitat aus der Dokumentation :
Die "Standard" und "singleTop" -Modi unterscheiden sich voneinander in einem einzigen Achtung: Jedes Mal, wenn es neue Absicht für eine „Standard“ Aktivität, ein neuen Instanz der Klasse wird erstellt, um reagieren auf diese Absicht. jede Instanz Griffe eine einzige Absicht. In ähnlicher Weise ein neue Instanz eines „singleTop“ activity kann auch ein neues zu handhaben erstellt werden Absicht. Allerdings , wenn die Zielaufgabe verfügt bereits über eine bestehende Instanz die Aktivität an der Spitze seines Stapel , wird diese Instanz erhalten Das neue Intent (in einem onNewIntent () Anruf); eine neue Instanz nicht erstellt wird.
Ich bin nicht 100% sicher, was „bereits eine bestehende Instanz der Tätigkeit an der Spitze seines Stapels hat“ bedeutet, aber vielleicht ist Ihre Aktivität diese Bedingung nicht erfüllen.
Würde singleTask
oder singleInstance
Arbeit für Sie? Oder vielleicht könnten Sie versuchen FLAG_ACTIVITY_SINGLE_TOP
Einstellung auf der Absicht, erstellen Sie, um zu sehen, ob das einen Unterschied macht, obwohl ich nicht glaube, es wird.
Sie können auf die gleiche bestehende Instanz Aktivität zurückkehren mit
android:launchMode="singleInstance"
im Manifest.
Wenn Sie von A
B
zurückkehren kann finish()
benötigt werden B
zu zerstören.
Zum einen kann Stack-Struktur untersucht werden. Für den Startmodus: singleTop
Wenn eine Instanz von der gleichen Aktivität ist bereits auf dem Task-Stack, dann wird diese Instanz wiederverwendet zu der Absicht, zu reagieren.
Alle Aktivitäten sind halten, in dem Stapel ( „first in last out“) so, wenn Ihre aktuelle Tätigkeit an der Spitze des Stapels, und wenn Sie es in der manifest.file als singleTop definieren
android:name=".ActivityA"
android:launchMode="singleTop"
Wenn Sie in der ACTIVITYA sind, die Aktivität neu erstellen nicht betreten werden onCreate wird fortgesetzt onNewIntent () und Sie können durch die Schaffung einer Meldung sehen Nicht gemeinfrei. Wenn Sie nicht über onNewIntent implementieren (Intent) Sie werden nicht neu Absicht erhalten
Intent activityMain = new Intent(ActivityA.this,
ActivityA.class);
activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(activityMain);
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
notify("onNewIntent");
}
private void notify(String methodName) {
String name = this.getClass().getName();
String[] strings = name.split("\\.");
Notification noti = new Notification.Builder(this)
.setContentTitle(methodName + "" + strings[strings.length - 1])
.setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
.setContentText(name).build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify((int) System.currentTimeMillis(), noti);
}
Das ist, weil die ursprüngliche A-Aktivität bereits durch die Zeit zerstört wird man es aus B, C oder D. Daher startet, wird onCreate anstelle von onNewIntent () aufgerufen werden. Eine Möglichkeit, dies zu lösen, ist immer zu zerstören die bestehenden A (mit FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK Verbindung, wenn startActivity), bevor ein neuen A beginnt, so onCreate wird immer dann aufgerufen werden, und Sie setzen den Code onNewIntent () in onCreate durch Prüfen, ob getIntent ( ) ist die Absicht, Sie begann mit.