2010-07-10 29 views
81

J'ai une application qui a une activité principale et ensuite vous pouvez cliquer sur les é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 fonctionne comme prévu. Toutefois, je souhaite que cette activité de recherche ne dispose que d'une seule instance sur la pile afin que les utilisateurs puissent effectuer des recherches multiples et que le retour les renvoie à la vue précédente avant qu'ils ne commencent à chercher (plutôt que de revenir à la page précédente). les résultats de recherche previouse)Android mode de lancement singleTask ou singleInstance?

le mode de lancement singleTask et singelInstance semble faire ce que je veux donc je ne sais pas lequel je devrais utiliser à cette fin et pourquoi?

Répondre

139

De la Application Fundamentals page du guide dev Android:

Par défaut, toutes les activités dans une application ont une affinité pour chaque autre - qui est, il y a une préférence pour tous appartenir à la même tâche .

Une activité "singleInstance" est la seule activité de . Si elle commence une autre activité, cette activité sera lancée dans une tâche différente indépendamment de 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é plus haut, il n'y a jamais plus d'une instance d'une activité « singleTask » ou « SingleInstance », de sorte que exemple devrait traiter tous les nouveaux intentions. Une activité "singleInstance" est toujours en haut de la pile (puisque c'est la seule activité dans la tâche ), donc il est toujours en position gérer l'intention. Cependant, une activité "singleTask" peut ou non avoir d'autres activités au-dessus dans la pile . Si c'est le cas, il n'est pas en position pour gérer l'intention, et l'intention est supprimée. (Même si l'intention est tombé, son arrivée aurait ont causé la tâche à venir au premier plan , où il resterait.)

4 Activities in a Task

Comme il n'y a jamais plus d'une instance de l'activité avec l'un ou l'autre mode de lancement, le bouton de retour vous mè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. Puisque votre pile d'activité se rapporte à une seule "tâche" d'utilisateur, et que vous n'avez pas une structure complexe Intent où singleInstance peut être utile de toujours les gérer, je suggère d'utiliser le mode de lancement singleTask.

Voici un bon blog pour plus d'informations, ainsi que créditée pour l'image: Android Activities and Tasks series – An introduction to Android’s UI component model

+3

Merci! ressemble à une bonne lecture ... la chose est réalisée Je souhaite 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 marché fonctionne) Et pour cela le singeTop est exactement ce que Im après mais merci pour l'aide de toute façon =) merci – Kman

+1

Salut, merci. Ce message bien écrit m'a aidé dans une pincée. – icecreamman

+0

Merci pour les détails, surtout celui-ci * (Même si l'intention est abandonnée, son arrivée aurait fait que la tâche revienne au premier plan, où elle resterait.) *, Ce qui efface instantanément ma confusion. Je pensais juste à ce qui se passerait si une seule tâche n'est pas en haut de la pile alors que je veux toujours y naviguer sans spécifier 'FLAG_ACTIVITY_CLEAR_TOP'. – neevek

4

singleTask et singleInstance activités ne peuvent commencer une tâche. Ils sont toujours à la racine de la pile d'activité. 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'informations android:launchMode.

+0

la dernière phrase est vraie pour singleInstance, pas singleTask –

+0

@SerdarS. Appréciez votre commentaire. En savoir plus 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 méthode 'onNewIntent()' plutôt que de créer une nouvelle instance. Une seule instance de l'activité peut exister à la fois. pour plus [developer.android.com] (https://developer.android.com/guide/components/activities/tasks-and-back-stack.html) –

+0

J'ai compris, alors j'avais tort. Désolé de déranger. –

27

dans un simple Way-

singleTask:

Le système crée une nouvelle tâche et instancie l'activité à l'origine 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 via un appel à sa méthode onNewIntent(), plutôt que de créer une nouvelle instance. Seul l'one instance de l'activité peut exister à la fois.

Remarque: Bien que l'activité commence dans une nouvelle tâche, le bouton Précédent renvoie toujours l'utilisateur à l'activité précédente.

singleInstance-

Identique à "singleTask", sauf que le système ne lance pas d'autres activités dans la tâche tenant 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.