web-dev-qa-db-fra.com

Existe-t-il un moyen d'avoir une seule et unique instance pour chaque activité?

Je constate que dans mon application, l'utilisateur peut être assez "imbriqué" dans les différentes activités ouvertes pendant l'utilisation de l'application.

Par exemple:

  1. Menu principal
  2. Liste d'objets
  3. Détails d'objet
  4. Objet Modifier
  5. Détails d'objet
  6. Détails de l'objet enfant
  7. Objet Enfant Modifier
  8. Détails de l'objet enfant

Désormais, lorsque l'utilisateur appuie en arrière, il doit passer deux fois par 'Détails de l'objet enfant' (le même objet, lorsqu'il est modifié, revient à la page détaillée), et il en va de même pour les 'Détails de l'objet parent'.

Existe-t-il un moyen de réutiliser des activités, si elles sont déjà ouvertes dans la pile, et de les réorganiser à l'avant? Le seul moyen que j'ai vu concerne les activités avec l'attribut launcher. Je crois avoir vu singleTask et singleTop.

Si je suis censé utiliser ces deux attributs, singleTask et singleTop, comment suis-je censé les utiliser? Lorsque j'ai essayé de les inclure dans l'application, cela ne faisait aucune différence. Dois-je également définir un indicateur lors du lancement de l'intention à l'aide de startActivity?

31
Cody

dans la propriété Activité manifeste, vous pouvez donner ce paramètre Android:launchMode="singleInstance"

Lisez plus en détail ici http://developer.Android.com/guide/topics/manifest/activity-element.html

37
ud_an

Ceci est votre drapeau! http://developer.Android.com/reference/Android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)

Notez le 'addFlags'. Notez également que onCreate ne sera pas appelé pour cette activité quand une nouvelle intention lui sera livrée. Il sera livré via la onNewIntent().

Cela ne garantit pas qu'une seule instance de l'activité est en cours d'exécution. Pour vous en assurer, vérifiez ceci: http://developer.Android.com/guide/topics/manifest/activity-element.html#lmode

23
Vikram Bodicherla

Utiliser Android: launchMode = "singleTask" est probablement la meilleure approche, car elle ne recrée pas l'activité si elle est déjà en cours d'exécution. Ajoutez-le simplement à l'activité dans votre fichier AndroidManifest.xml et vous devriez être prêt.

<activity
    Android:name=".MyActivity"
    Android:label="@string/app_name"
    Android:launchMode="singleTask"
    >
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />
        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
 </activity>

Voici une autre question qui pourrait être utile: Mode de lancement Android singleTask ou singleInstance?

22
Balu

Cela a fonctionné pour moi.

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

Si une instance de cette Activité existe déjà, elle sera déplacée au premier plan. Si une instance n'existe PAS, une nouvelle instance sera créée.

7
Anirban

Oui, vous pouvez exiger la création d'une seule instance de ces activités, mais cela n'est généralement pas recommandé. Si vous vous souciez simplement de l'histoire, jetez un coup d'œil à Intent.FLAG_ACTIVITY_CLEAR_TOP .

7
kabuko

Ajouter des drapeaux d'intention en tant que 

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);StartActivity(srcActivity.Java, DesiredActivity.class);

Puis à onPause() DesiredActivity

Ajouter finish(), Cela a fait le travail pour moi.

1
P-RAD
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY);

Ça marche pour moi :)

0
शु-Bham