it-swarm.com.de

New Intent () startet neue Instanz mit Android: launchMode = "singleTop"

Ich habe die Aktivität A mit Android:launchMode="singleTop" im Manifest.

Wenn ich zu Aktivität B, C und D gehe, habe ich Menü-Verknüpfungen, um zur Stammaktivität meiner Anwendung (A) zurückzukehren.

Der Code sieht so aus:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

Anstatt jedoch zur bereits vorhandenen Instanz A meines MainActivity.class zurückzukehren, wird eine neue Instanz erstellt -> es wird onCreate() anstelle von onNewIntent().

Dies ist nicht das erwartete Verhalten, richtig?

56
znq

Das sollte den Trick tun.

<activity ... Android:launchMode="singleTop" />

Wenn Sie eine Absicht zum Starten der App erstellen, verwenden Sie Folgendes:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Das sollte das sein.

68
Vidar Vestnes

Was für mich am Ende funktioniert hat, war Folgendes:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
28
znq

Zitat aus der Dokumentation

Die Modi "Standard" und "SingleTop" unterscheiden sich in nur einem Respekt: ​​Jedes Mal, wenn es eine neue Absicht gibt für eine "Standard" -Aktivität eine neue Instanz der Klasse wird mit .__ erstellt. auf diese Absicht reagieren. Jede Instanz handhabt eine einzelne Absicht. In ähnlicher Weise a neue Instanz einer "singleTop" -Aktivität kann auch erstellt werden, um ein neues .__ zu behandeln. Absicht. Jedoch die Zielaufgabe hat bereits eine Instanz von die Aktivität an der Spitze ihres stack, erhält diese Instanz die neue Absicht (in einem onNewIntent () -Aufruf); Eine neue Instanz wird nicht erstellt.

Ich bin nicht zu 100% sicher, was "bereits eine Instanz der Aktivität an der Spitze des Stapels" bedeutet, aber möglicherweise erfüllt Ihre Aktivität diese Bedingung nicht.

Würden singleTask oder singleInstance für Sie arbeiten? Oder Sie könnten versuchen, FLAG_ACTIVITY_SINGLE_TOP auf die Absicht einzustellen, die Sie erstellen, um zu sehen, ob dies einen Unterschied macht, obwohl ich nicht glaube, dass dies der Fall ist.

14
Mark B

Sie können mit Android:launchMode="singleInstance" zu derselben vorhandenen Instanz von Activity zurückkehren.

im Manifest ... Wenn Sie von A zu B zurückkehren, kann finish() erforderlich sein, um B zu löschen.

6
rbin

Erstens kann die Stack-Struktur untersucht werden. Für den Startmodus: singleTop
Wenn sich eine Instanz derselben Aktivität bereits auf dem Task-Stack befindet, wird diese Instanz erneut verwendet, um auf die Absicht zu reagieren. 

Alle Aktivitäten werden im Stack gehalten ("first in last out"). Wenn sich Ihre aktuelle Aktivität an der Spitze des Stapels befindet und Sie sie in der manifest.file als singleTop definieren

Android:name=".ActivityA"
Android:launchMode="singleTop"

wenn Sie sich in ActivityA neu erstellen, wird die Aktivität, die bei onCreate nicht eingegeben wird, wiederhergestellt, und OnNewIntent () wird fortgesetzt. Wenn Sie eine Benachrichtigung erstellen, wird dies angezeigt.

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);

        }
1
huseyin

Dies liegt daran, dass die ursprüngliche A-Aktivität bereits zerstört wird, wenn Sie sie von B, C oder D aus starten. Daher wird onCreate anstelle von onNewIntent () aufgerufen. Eine Möglichkeit, dies zu lösen, besteht darin, das vorhandene A immer zu zerstören (vor dem Start eines neuen A mit der FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK-Verknüpfung), bevor Sie ein neues A starten, und onCreate wird immer aufgerufen. ) ist die Absicht, mit der Sie begonnen haben.

0
Rachel