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:
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
?
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
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
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?
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.
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 .
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.
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY);
Ça marche pour moi :)