Question

Je Activité A avec android:launchMode="singleTop" dans le manifeste.

Si je vais à l'activité B, C, et je D il raccourcis du menu pour revenir à mes applications activité racine (A).

Le code ressemble à ceci:

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

Cependant, au lieu de revenir à la A instance déjà existante de mon MainActivity.class crée une nouvelle instance -> il va onCreate() au lieu de onNewIntent()

.

Ce n'est pas le comportement attendu, non?

Était-ce utile?

La solution

Cela devrait faire l'affaire.

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

Lorsque vous créez une intention de commencer l'utilisation de l'application:

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

Ce que devrait être nécessaire.

Autres conseils

Qu'est-ce réellement travaillé pour moi à la fin était la suivante:

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

Citation du :

  

Les modes "standard" et "singleTop"   diffèrent les uns des autres en un seul   le respect: Chaque fois qu'il ya une nouvelle intention   pour une activité « standard », une nouvelle   instance de la classe est créée pour   répondre à cette intention. chaque instance   gère une seule intention. De même, un   nouvelle instance d'une activité « singleTop »   peut également être créé pour gérer une nouvelle   intention. Cependant, si la tâche cible   a déjà une instance existante de   l'activité au sommet de sa   pile , cette instance recevra   la nouvelle intention (dans un onNewIntent ()   appel); une nouvelle instance ne se crée pas.

Je ne suis pas 100% sûr de ce que « a déjà une instance existante de l'activité au sommet de sa pile » signifie, mais peut-être votre activité ne répond pas à cette condition.

Je singleTask ou travail singleInstance pour vous? Ou peut-être que vous pourriez essayer de régler FLAG_ACTIVITY_SINGLE_TOP sur l'intention que vous créez pour voir si cela fait une différence, même si je ne le pense pas.

Vous pouvez revenir à la même instance existante de l'activité avec android:launchMode="singleInstance"

dans le manifeste. Lorsque vous revenez à A de B, il peut être nécessaire de détruire finish() B.

Tout d'abord, la structure Stack peut être examiné. Pour le mode de lancement: singleTop
Si une instance de la même activité est déjà au-dessus de la pile de tâches, cette instance sera réutilisée pour répondre à l'intention.

Toutes les activités sont la main dans la pile ( « premier dernier sorti ») donc si votre activité actuelle est en haut de la pile et si vous définissez dans le manifest.file comme singleTop

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

si vous êtes dans le ActivityA recréer l'activité qu'elle ne conclura onCreate reprendra onNewIntent () et vous pouvez voir en créant une notification Non. Si vous ne mettre en œuvre onNewIntent (d'intention) vous ne serez pas nouvelle intention

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

        }

En effet, la Une activité originale est déjà détruite par le démarrage à partir de B, C ou D. Par conséquent, onCreate sera appelée au lieu de onNewIntent (). Une façon de résoudre est de toujours détruire l'existant A (en utilisant FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK conjonction quand startActivity) avant de commencer une nouvelle A, donc onCreate sera toujours appelé, et vous mettre le code de onNewIntent () dans onCreate en vérifiant si getIntent ( ) est l'intention que vous avez commencé avec.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top