Mon application a des notifications qui, évidemment, sans aucun indicateur, démarrent une nouvelle activité à chaque fois, de sorte que plusieurs activités identiques s'exécutent les unes sur les autres, ce qui est tout simplement faux.
Ce que je veux faire, c'est mettre l'activité spécifiée dans l'intention en attente de notifications, au premier plan si elle est déjà en cours d'exécution, sinon la démarrer.
Jusqu'à présent, l'intention / l'intention en attente pour cette notification que j'ai est
private static PendingIntent prepareIntent(Context context) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
et bizarrement, ça marche parfois, parfois ça ne marche pas ... J'ai l'impression d'avoir déjà essayé chaque combinaison de drapeaux.
onNewIntent
et définir des indicateurs)Je pense que la meilleure façon de le faire et de manière simple est de démarrer l'activité normalement, mais définissez cette activité dans le manifeste avec la
singleInstance
propriété. Avec cela, vous abordez pratiquement les deux problèmes que vous rencontrez actuellement, en mettant l'activité au premier plan tout le temps, et en laissant le système d'exploitation en créer automatiquement une nouvelle si aucune activité n'existe ou mettre au premier plan l'activité actuellement existante (grâce à lasingleInstance
propriété).Voici comment une activité est déclarée en tant qu'instance unique:
Aussi pour éviter une animation saccadée lors du lancement via singleInstance, vous pouvez utiliser à la place "singleTask", les deux sont très similaires mais la différence est expliquée ici selon la documentation de Google:
J'espère que cela t'aides.
Cordialement!
la source
Je pense que ce dont vous avez besoin est dans
singleTop
Activity
, plutôt que dans unsingleTask
ousingleInstance
.Ce que dit la documentation répond parfaitement à vos besoins:
En plus de ça (sans jeu de mots), j'avais exactement le même besoin que vous. J'ai testé tous les
launchMode
drapeaux pour comprendre comment ils se comportent réellement dans la pratique et, par conséquent,singleTop
c'est en fait le meilleur pour cela: pas d'animation bizarre, application affichée une fois dans la liste des applications récentes (contrairement àsingleInstance
cela qui l'affiche deux fois parce qu'elle ne le fait pas) t permettre à tout autreActivity
de faire partie de sa tâche), et se comporter correctement, que la cibleActivity
existe déjà ou non.la source
C'est un vieux fil, mais pour tous ceux qui cherchent encore une réponse, voici ma solution. C'est purement dans le code, sans paramètres de manifeste:
Ici, FLAG_ACTIVITY_SINGLE_TOP ouvre l'activité existante si elle se trouve en haut de la pile de tâches. S'il n'est pas en haut, mais à l'intérieur de la pile, FLAG_ACTIVITY_CLEAR_TOP supprimera toutes les activités en plus de l'activité cible et l'affichera. Si l'activité n'est pas dans la pile de tâches, une nouvelle sera créée. Un point extrêmement important à mentionner - deuxième paramètre de PendingIntent.getActivity (), c'est-à-dire que requestCode devrait avoir une valeur non nulle (je l'ai même appelé NON_ZERO_REQUEST_CODE dans mon extrait de code), sinon ces indicateurs d'intention ne fonctionneront pas. Je ne sais pas pourquoi c'est comme ça. L'indicateur FLAG_ACTIVITY_SINGLE_TOP est interchangeable avec android: launchMode = "singleTop" dans la balise d'activité du manifeste.
la source
Je sais qu'il est ancien, mais rien de ce qui précède ne correspondait à mon application.
Sans modifier les manifestes et autres configurations, voici le code pour ramener votre application au premier plan - ou l'ouvrir lorsqu'elle est fermée
la source
J'ai essayé cela, et cela a fonctionné même si l'EDI se plaignait du code
la source
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
n'est pas un drapeau valide pourPendingINtent.getActivity
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
n'est pas un drapeau valide lorsqu'il est utilisé comme unPendingIntent
. Ou peut-être que vous vouliez dire qu'il n'est pas valide de passer dans lagetActivity
méthode, mais est-il valide pour utiliser commeIntent
indicateur qui est ensuite utilisé comme unPendingIntent
?Puisque vous dites que vous souhaitez démarrer votre activité si elle n'a pas déjà commencé, cela ne vous dérangerait peut-être pas de la redémarrer. J'ai également testé une tonne de suggestions et de combinaisons d'indicateurs pour l'intention, cela amènera toujours l'activité dont vous avez besoin au premier plan, même si elle ne conservera aucun état précédemment associé.
API11 + uniquement.
la source
J'ai eu un problème similaire après avoir ajouté des notifications trouvées sur le site de formation Android . Aucune des autres réponses ici n'a fonctionné pour moi , mais cette réponse a fonctionné pour moi. Résumé:
la source