7
votes

Comment effacer la pile d'historique d'activité lorsque vous appuyez sur le bouton Accueil?

J'écris une application qui ont deux "modes"; Un et un modifier mode. L'application expose deux activités principales / lanceurs (disons, A et d ) qui ont à leur tour leurs propres chaînes d'activité ( B , C et e , f respectivement). Les deux activités de point d'entrée A et d exposeront deux icônes avec des étiquettes distinctes dans l'écran d'accueil et les deux chaînes ne sont jamais croisées, c'est-à-dire une fois que vous avez démarré l'application dans une vue. mode avec activité A , le seul itinéraire que vous pouvez accéder à l'arrière et en avant est A B , C et si Vous démarrez l'application en mode édition avec l'activité d , la seule chaîne d'activité disponible est d , E , f .

Maintenant, mon problème est que si vous démarrez l'application, par exemple. Mode d'affichage (chaîne d'activité A , B , C ) et appuyez sur le bouton Accueil de n'importe quelle activité de cette chaîne, je revenons à l'écran d'accueil (bien sûr) mais si je redémarre ensuite l'application en mode édition (chaîne d'activité d , E , f ) je reçois le activité que j'étais sur lorsque vous appuyez sur le bouton Accueil (c'est-à-dire une activité dans la mauvaise chaîne) - pas le point d'entrée attendu pour le mode édition; activité d .

Comment puis-je résoudre ce problème?

J'ai essayé diverses combinaisons de Android: nohistory , Android: ClearTaskonLaunch androidmanifest.xml pour les activités concernées. Mais ils semblent seulement affecter l'activité même, pas la chaîne entière.

Je voudrais supprimer toute la chaîne d'activités ( A B , C ou D , e , f ) de la pile d'historique Lorsque vous appuyez sur le bouton HOME, mais gardez toujours la pile intacte pendant que je suis toujours dans la chaîne (je veux pouvoir appuyer sur Le bouton arrière de, disons, activité B et aller à l'activité A ).


5 commentaires

Vous devriez avoir des yeux sur ce Nisha113A5.Blogspot.com ?? revenons


Salut @himanshu! Oui, cette question aurait probablement mené une conclusion de travail. Merci pour le conseil!


Salut @android_Hungry! Cette solution fonctionnerait probablement. Je ne suis pas sûr, cependant, si je le choisi comme ma mise en œuvre principale. Pour moi, cela ressemble un peu comme "sombre quel artisanat" qui est lié pour ne pas travailler sur certains appareils. C'est une coupe courte, je n'ai pas le luxe de prendre.


@DBM: Oui, vous êtes juste, je viens de passer à travers ce post le même jour où je lisa votre question ..


3 Réponses :


4
votes

On dirait que vous devez utiliser le inent.flag_activity_clear_top code> Drapeau de votre domicile, mais bien sûr, vous ne pouvez pas ajouter ces indicateurs dans le fichier AndroidManifest.xml. Peut-être devriez-vous avoir un point d'entrée unique qui lance ensuite l'activité correcte code> - vous pouvez utiliser un Activité-alias Pour qu'il ressemble à deux points d'entrée à l'utilisateur.

Par exemple - Vous définissez les activités dans votre fichier manifeste: P >

ActivityInfo activityInfo = getPackageManager().getPackageInfo( this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA);
int launchTypeResource = activityInfo.metaData.getInt("launch_type");
String launchType = context.getString(launchTypeResource);
if(launchType == null) {
   // handle error
   throw new Exception();
}
Intent newIntent;
if(launchType.equals(context.getString(R.string.launch_view)) {
    newIntent = createIntent(ViewActivity.class);
} else if(launchType.equals(context.getString(R.string.launch_edit)) {
    newIntent = createIntent(EditActivity.class);
}
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(newIntent);


5 commentaires

Salut @martin! Je me suis prononcé la liberté de modifier légèrement votre extrait de code sur la manière de récupérer les méta-données associées au Activity-alias-alias . Il s'est avéré qu'il n'est pas envoyé par l'intention d'appel mais lue plutôt de la structure de données ActivityInfo .


Très bonne réponse! Prendre le montant des efforts que vous avez mis et le fait que votre réponse était la première (correcte et travail-travail-ish, vient de vous accorder une marque verte :-)


@Martyn Pouvez-vous modifier votre réponse pour contenir la lecture correcte des données?


@Ovidiulatcu, j'ai maintenant recommandé mon correctif proposé. Malheureusement, je ne semble pas encore avoir le droit de modifier les questions / réponses des autres peuples, mais je ne peux donc pas faire beaucoup plus, mais j'attends l'examen de Martyn.


Toutes mes excuses - était en vacances! : D ont corrigé le code - merci de le pointer.



4
votes

Veuillez utiliser la méthode suivante sur la touche Accueil:

Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


1 commentaires

Je suppose que cela serait effectivement le moyen le plus simple de résoudre mon problème. Je vais cependant utiliser une autre implémentation qui rend cette solution qui ne convient pas à mon application cette fois-ci. J'ai cependant appris quelque chose par votre réponse et pour cela, je vous remercie.



1
votes

Vous pouvez envisager d'utiliser une seule activité pour chaque chaîne (ce serait seulement A et d ).

Ensuite, implémentez le contenu de A B B et C et d , e et f comme fragments et changez simplement le fragment indiqué sur l'activité lors de la navigation d'avant en arrière.

Combinez ceci avec Android: NoHistory et vous devez obtenir l'effet souhaité - bien que cela nécessiterait une réécriture et que vous incluez le package de compatibilité dans votre projet si vous envisagez de cibler la version ciblée en nid d'abeille. < / p>


1 commentaires

C'était en fait une utilisation très élégante des fragments et, étant donné que mon application est déjà construite par des fragments, cela ne serait même pas une énorme réécriture. Même si je pense que c'était la chose juste à faire pour accepter la réponse de @Martyn, je pense que c'est le choix architectural que je vais aller avec à la fin. Merci pour la bonne idée!