84 votes

Mode de lancement Android singleTask ou singleInstance ?

J'ai une application dont l'activité principale est une liste. Vous pouvez ensuite cliquer sur des éléments, ce qui ouvre une vue détaillée de cet élément. J'ai également une activité de recherche qui est similaire à l'activité principale et qui fonctionne comme prévu.

Cependant, je souhaite que cette activité de recherche n'ait qu'une seule instance sur la pile afin que les utilisateurs puissent effectuer plusieurs recherches et que le fait de cliquer sur le bouton de retour les ramène à la vue précédente sur laquelle ils se trouvaient avant de commencer la recherche (plutôt que de revenir aux résultats de la recherche précédente).

Les deux modes de lancement, singleTask et singelInstance, semblent faire ce que je veux. Je ne suis pas sûr de savoir lequel je dois utiliser dans ce but et pourquoi ?

141voto

Guzba Points 1522

De la Principes de base des applications page du guide de développement Android :

Par défaut, toutes les activités d'une application ont une affinité entre elles c'est-à-dire qu'il y a une préférence qu'elles appartiennent toutes à la même tâche.

Une activité "singleInstance" est seule et unique activité de sa tâche. Si elle lance une autre activité, cette activité sera lancée dans une tâche différente, quel que soit son mode de lancement - comme si FLAG_ACTIVITY_NEW_TASK était dans l'intention de l'utilisateur. intention. À tous les autres égards, le mode "singleInstance" est identique à "singleTask".

Comme indiqué ci-dessus, il n'y a jamais plus plus d'une instance d'une activité "singleTask" ou ou d'une activité "singleInstance", donc cette instance est censée gérer tous les nouveaux nouvelles intentions. Une activité "singleInstance se trouve toujours en haut de la pile (puisqu'elle est la seule activité de la tâche), elle est donc toujours en position de traiter l'intention. En revanche, une activité une activité "singleTask" peut ou non avoir avoir d'autres activités au-dessus d'elle dans la pile. Si c'est le cas, elle n'est pas en position pour traiter l'intention, et l'intention l'intention est abandonnée. (Même si l'intention l'intention est abandonnée, son arrivée aurait son arrivée aurait fait passer la tâche au l'avant-plan, où elle serait restée).

4 Activities in a Task

Étant donné qu'il n'y a jamais plus d'une instance de l'activité avec l'un ou l'autre mode de lancement, le bouton retour vous ramènera toujours à l'instance existante de l'activité dans votre cas.

Une différence importante est que "singleTask" ne nécessite pas la création d'une nouvelle tâche pour les nouvelles activités qui sont lancées lorsque quelque chose est sélectionné. Il ne devra pas non plus supprimer cette nouvelle tâche à chaque fois que l'on appuie sur le bouton retour.

Puisque votre pile d'activités se rapporte à une seule "tâche" d'utilisateur et que vous n'avez pas l'air d'avoir une structure d'intentions complexe où une seule instance pourrait être bénéfique pour toujours les gérer, je suggérerais d'utiliser le mode de lancement singleTask.

Voici un bon article de blog pour plus d'informations, ainsi que le crédit de l'image : Série d'activités et de tâches Android - Introduction au modèle de composants d'interface utilisateur d'Android

4 votes

Merci ! cela semble être une bonne lecture... le truc c'est que j'ai réalisé que je voulais en fait plusieurs instances d'une activité et que seulement lorsque l'activité de premier plan est une activité de recherche et qu'une autre recherche est effectuée, elle doit utiliser cette activité existante (comme la façon dont le marché fonctionne) et pour cela le singeTop est exactement ce que je cherche mais merci pour l'aide quand même =) merci

1 votes

Hé, merci. Cet article bien écrit m'a aidé dans une situation difficile.

0 votes

Merci pour les détails, notamment celui-ci (Même si l'intention est abandonnée, son arrivée aurait fait passer la tâche au premier plan, où elle resterait). ce qui dissipe instantanément ma confusion. Je pensais juste à ce qui se passe si une activité singleTask n'est pas au sommet de la pile alors que je veux quand même y naviguer sans spécifier FLAG_ACTIVITY_CLEAR_TOP .

30voto

Tarun Varshney Points 2164

D'une manière simple

singleTask :

Le système crée une nouvelle tâche et instancie l'activité à la racine de la nouvelle tâche. Toutefois, si une instance de l'activité existe déjà dans une tâche distincte, le système achemine l'intention vers l'instance existante par un appel à sa fonction onNewIntent() plutôt que de créer une nouvelle instance. Seulement one instance de l'activité peut exister à la fois.

Remarque : bien que l'activité démarre dans une nouvelle tâche, le bouton Précédent ramène toujours l'utilisateur à l'activité précédente.

singleInstance-

Même que "singleTask" sauf que le système ne lance pas d'autres activités dans la tâche qui détient l'instance . L'activité est toujours le seul et unique membre de sa tâche ; toutes les activités lancées par celle-ci s'ouvrent dans une tâche séparée. .

4voto

Rupesh Yadav Points 2721

singleTask y singleInstance les activités ne peuvent que commencer une tâche. Elles se trouvent toujours à la racine de la pile d'activités. De plus, le dispositif ne peut contenir qu'une seule instance de l'activité à la fois - une seule tâche de ce type.
pour plus Android:launchMode .

1 votes

La dernière phrase est vraie pour singleInstance, pas pour singleTask

0 votes

@SerdarS. J'apprécie votre commentaire. Ajoutant plus sur singleTask - Le système crée une nouvelle tâche et instancie l'activité à la racine de la nouvelle tâche. Toutefois, si une instance de l'activité existe déjà dans une tâche distincte, le système achemine l'intention vers l'instance existante par un appel à sa fonction onNewIntent() plutôt que de créer une nouvelle instance. Il ne peut exister qu'une seule instance de l'activité à la fois. pour en savoir plus développeur.Android.com

0 votes

Je l'ai, alors j'avais tort. Désolé de vous avoir dérangé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X