Mode de lancement Android singleTask ou singleInstance? [fermé]

84

J'ai une application qui a une liste comme activité principale et vous pouvez ensuite cliquer sur des éléments qui ouvrent une vue détaillée de cet élément. J'ai également une activité de recherche 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 rechercher plusieurs fois et en cliquant en arrière, ils reviendraient à la vue précédente dans laquelle ils se trouvaient avant de commencer la recherche (plutôt que de revenir aux résultats de recherche précédents)

les modes de lancement singleTask et singelInstance semblent faire ce que je veux donc je ne sais pas lequel je devrais utiliser à cette fin et pourquoi?

Kman
la source

Réponses:

141

Depuis la page Application Fundamentals du guide de développement Android:

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

Une activité "singleInstance" est la seule activité de sa tâche. S'il démarre 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. À tous autres égards, le mode "singleInstance" est identique à "singleTask".

Comme indiqué ci-dessus, il n'y a jamais plus d'une instance d'une activité "singleTask" ou "singleInstance", de sorte que cette instance est censée gérer toutes les nouvelles intentions. Une activité "singleInstance" est toujours en haut de la pile (car c'est la seule activité de la tâche), elle est donc toujours en mesure de gérer l'intention. Cependant, une activité "singleTask" peut ou non avoir d'autres activités au-dessus d'elle dans la pile. Si tel est le cas, il n'est pas en mesure de gérer l'intention et l'intention est supprimée. (Même si l'intention est abandonnée, son arrivée aurait fait passer la tâche au premier plan, là où elle resterait.)

4 Activités dans une tâche

Puisqu'il n'y a jamais plus d'une instance de l'activité avec l'un ou l'autre des modes de lancement, le bouton de retour vous amè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 lancées lorsque quelque chose est sélectionné. Il n'aura pas non plus à supprimer cette nouvelle tâche sur le bouton de retour à chaque fois.

Étant donné que votre pile d'activité appartient à une seule "tâche" utilisateur, et qu'il ne semble pas que vous ayez une structure Intent complexe où singleInstance peut ê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 crédité pour l'image: Série Activités et tâches Android - Une introduction au modèle de composant d'interface utilisateur d'Android

Guzba
la source
4
Merci! ressemble à une bonne lecture ... la chose a été réalisée que je VEUX réellement plusieurs instances d'une activité et seulement lorsque l'activité de premier plan est une activité de recherche et qu'une autre recherche est effectuée si elle utilise cette activité existante (comme le fonctionnement du marché) pour cela, le singeTop est exactement ce que je suis après mais merci pour l'aide quand même =) merci
Kman
1
Hey, merci. Ce message bien écrit m'a aidé à la rigueur.
icecreamman
Merci pour les détails, en particulier celui-ci (même si l'intention est abandonnée, son arrivée aurait fait passer la tâche au premier plan, là où elle resterait.) , Ce qui dissipe instantanément ma confusion. Je pensais juste à ce qui se passerait si une seule activité de tâche n'est pas au sommet de la pile alors que je veux toujours y accéder sans le spécifier FLAG_ACTIVITY_CLEAR_TOP .
neevek le
30

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. Cependant, si une instance de l'activité existe déjà dans une tâche distincte, le système achemine l'intention vers l'instance existante via un appel à sa onNewIntent()méthode, plutôt que de créer une nouvelle instance. Seule one instancel'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.

seule instance-

Identique à "singleTask", sauf que le système ne lance aucune autre activité dans la tâche contenant l'instance . L'activité est toujours le seul et unique membre de sa tâche; toutes les activités démarrées par celui-ci s'ouvrent dans une tâche distincte .

Tarun Varshney
la source
4

singleTasket les singleInstanceactivités ne peuvent que commencer une tâche. Ils sont toujours à la racine de la pile d'activités. De plus, l'appareil ne peut contenir qu'une seule instance de l'activité à la fois - une seule de ces tâches.
pour plus d' Android: launchMode .

Rupesh Yadav
la source
1
la dernière phrase est vraie pour singleInstance, pas singleTask
Serdar Samancıoğlu
@SerdarS. apprécie ton commentaire. Ajouter plus d'informations sur singleTask- Le système crée une nouvelle tâche et instancie l'activité à la racine de la nouvelle tâche. Cependant, si une instance de l'activité existe déjà dans une tâche distincte, le système achemine l'intention vers l'instance existante via un appel à sa onNewIntent()méthode, plutôt que de créer une nouvelle instance. Une seule instance de l'activité peut exister à la fois. pour plus de developer.android.com
Rupesh Yadav
Compris, alors je me suis trompé. Désolé de déranger.
Serdar Samancıoğlu