Lorsque le vieil homme d'activité Aller simple certaines années

questions introduites

Dans le projet, l'activité a été le développement de multiples sauts de problèmes les plus courants, de nombreuses solutions en ligne, mais comment résoudre est le meilleur est souvent un mal de tête, je veux dire comment résoudre vraiment ce question sans laisser une trace de Bug, d'abord introduit plusieurs programmes existants ainsi que les avantages et les inconvénients

AOP Aspect Oriented

AOP ne parle pas ici de l'intégration Pour Baidu s'il vous plaît tourner à gauche, où ils parlent des avantages et des inconvénients

textView.setOnClickListener (nouveau OnClickListener () { @EnableFastOnClick @Override public void onClick (Voir v) { } });
  • Avantages: méthodes annoter Voir événement click, il semble relativement simple
  • Inconvénients: partout Voir l'événement Click doit être annotés, les coûts de développement élevés, sujettes à des omissions

Activité Mode de démarrage

< activité android: name = "ui.activity.XXXActivity" android: launchMode = "singleTop" / >

L'ensemble de l'activité dans le fichier, le mode démarrage examen ici singleTop

singleTop: mode haut simple, si la pile de tâches à pile l'existence de cette activité ouverte, ne sera pas recréer l'activité, mais la réutilisation activité existante. Assurez-vous en haut de la pile, le cas échéant, ne crée pas un doublon

  • Avantages: mode de définition de l'activité directement dans le fichier manifeste, simple et brut
  • Inconvénients: Chaque nouvelle activité doit être réglé sur le mode de démarrage, et ne peuvent spécifier singleTop, les coûts de développement plus élevés, sujettes à des omissions

interception startActivity

Tout d'abord, nous devons faire un outil de jugement, double-cliquez sur

public final class DoubleClickHelper { finale statique privée de TIME_ARRAY = new long ; // longueur du tableau représente un enregistrement d'opération double clic seulement / ** * Que l'opération double-clic dans un court laps de temps * / public static boolean isOnDoubleClick () { // défaut durée de l'intervalle retourner isOnDoubleClick (1500); } / ** * Que l'opération double-clic dans un court laps de temps * / public static boolean isOnDoubleClick (heure int) { System.arraycopy (TIME_ARRAY, 1, TIME_ARRAY, 0, TIME_ARRAY.length - 1); TIME_ARRAY  = SystemClock.uptimeMillis (); retour TIME_ARRAY > = (SystemClock.uptimeMillis) - (temps); } }

Méthode StartActivity de l'activité de réécriture

BaseActivity classe abstraite publique étend AppCompatActivity { @Override startActivity public void (intention Intent) { si (DoubleClickHelper.isOnDoubleClick (500)) { retour; } super.startActivity (intention); } }

En fait, il y a une échappatoire écrite, penchons-nous sur la méthode saut d'activité

Je pense que la première chose que vous sentez est comme moi, c'est le cheval de Dieu? Tu veux que je Réécrire plus?

Rencontrez ce problème, maintenez la recrue la cuisse processus général:

  • Rookie: a rencontré un problème de comment ne pas faire?
  • Vieil oiseau: Non Baidu ah! Baidu ne pas?
  • Rookie: Baidu comment faire?
  • Anciens combattants: Baidu est impossible de changer Google ah!
  • Rookie: Google, ni comment faire?
  • Vieil oiseau: le code source est le meilleur professeur!

VOici parler d'une pièce, nous allons résoudre ce problème en regardant le code source, regardez le code source startActivity

Voici les différents paramètres de la même méthode d'appel nom, regard

StartActivity finalement avéré être un startActivityForResult de rappel

De là, voir startActivityForResult deux méthodes, les paramètres de la méthode ou méthode de paramètre de longueur d'appel court, ici nous ne devons réécrire les méthodes à long paramétriques, nous ne pouvons pas utiliser juste de cette façon, et le startActivity en startActivityForResult

BaseActivity classe abstraite publique étend AppCompatActivity { @Override startActivityForResult public void (intention Intent, int requestCode, @Nullable Options Bundle) { si (DoubleClickHelper.isOnDoubleClick (500)) { retour; } super.startActivityForResult (intention, requestCode, options); } }

En fait, cela est aussi un problème, si l'interface nécessite plusieurs sauts comment le faire? Tel est pas le BaseActivity mort d'écriture directe pas propice à l'expansion?

Pour résoudre ce problème est très simple, dans BaseActivity réserve une méthode, une sous-classe peut remplacer cette méthode pour décider d'inspecter et de déterminer la question de l'activité multiple de saut

BaseActivity classe abstraite publique étend AppCompatActivity { @Override startActivityForResult public void (intention Intent, int requestCode, @Nullable Options Bundle) { si (isCheckActivityJump () && DoubleClickHelper.isOnDoubleClick (500)) { retour; } // Voir la source qui finira par appeler startActivityForResult startActivity super.startActivityForResult (intention, requestCode, options); } / ** * Vérifiez que le saut de fréquence d'activité, sauter pour éviter les doubles emplois * / isCheckActivityJump booléen protégé () { // jugement par défaut et que vous devez vérifier return true; } }

En fait, ce sont ces deux codes, très simple, puis résumer

  • Avantages: traitement de la classe de base, une fois pour toutes, le développement d'un faible coût
  • Inconvénients: ne peut pas déterminer avec précision si l'activité de saut est répété, qui est à la fois si saut deux activités différentes, le résultat est que le premier saut réussi, alors que le second n'a pas sauté

optimisation d'interception startActivityForResult

Une solution encore restée Bug, la poursuite de la perfection, comment pouvons-nous tolérer que cela se produise, alors nous allons donner à cette question tirage au sort à la clôture réussie

Tout d'abord veulent savoir l'activité de saut répétition est pas la même chose, nous pouvons être jugés par objet intention, mais avant cela, nous devons d'abord examiner l'activité du mode de démarrage

  • L'intention explicite de commencer
  • Constructor: nouvelle intention (Contexte packageContext, classe < ? >  CCRS)
  • méthodes d'objet: intent.setClass (Contexte packageContext, classe < ? >  CCRS)
  • intention implicite de commencer
  • Constructeur: nouvelle intention (l'action String)
  • méthodes d'objet: intent.setAction (actions String)

Les deux ont été énumérés ici utiliser le mode de démarrage, nous pouvons utiliser l'intention explicite et implicite intention de créer une marque de Tag respectivement, utilisé pour déterminer si le saut est répété activité

// objet marqueur tag String; si (intent.getComponent ()! = null) {// explicite Jump tag = intent.getComponent () getClassName () .; } Else if (intent.getAction ()! = Null) {// saut implicite tag = intent.getAction (); }

En plus de déterminer si oui ou non une répétition, la nécessité d'intervalle de saut est déterminé à nouveau

if (tag.equals (mActivityJumpTag) && mActivityJumpTime > = SystemClock.uptimeMillis () - 500) { // chèque ne passe pas résultat = false; }

Le code complet est le suivant

BaseActivity classe abstraite publique étend AppCompatActivity { @Override startActivityForResult public void (intention Intent, int requestCode, @Nullable Options Bundle) { si (startActivitySelfCheck (intention)) { // Voir la source qui finira par appeler startActivityForResult startActivity super.startActivityForResult (intention, requestCode, options); } } private String mActivityJumpTag; mActivityJumpTime longtemps privé; / ** * Vérifier si l'activité actuelle répéter le saut, ne pas besoin de vérifier et remplacer cette méthode pour renvoyer true * * Intention @param objet Intent est utilisé pour sauter * @Return vérifier en retournant vrai, ne pas vérifier en retournant faux * / protégé booléenne startActivitySelfCheck (intention d'intention) { // vérification par défaut boolean résultat = true; // objet marqueur tag String; si (intent.getComponent ()! = null) {// explicite Jump tag = intent.getComponent () getClassName () .; } Else if (intent.getAction ()! = Null) {// saut implicite tag = intent.getAction (); } Else { résultat retour; } if (tag.equals (mActivityJumpTag) && mActivityJumpTime > = SystemClock.uptimeMillis () - 500) { // chèque ne passe pas résultat = false; } // marque de début et un temps record mActivityJumpTag = étiquette; mActivityJumpTime = SystemClock.uptimeMillis (); résultat retour; } }

Le code ci-dessus a été rigoureusement testé, il n'y a pas de problème, puis résumez

  • Avantages: parfait
  • Inconvénients: n'existe pas

Cette solution a été ajoutée à mordre le paquet Hong Deluxe: AndroidProject, vous accueillent mentionné question, a accueilli la star

fin

Si vous avez des idées sur la planification de leur carrière future, veulent améliorer leur technique, vous pouvez recevoir notre matériel d'apprentissage libre, la technologie Daniel Qinshou, le contenu de l'information comprennent: l'interface utilisateur avancée, optimisation des performances, haute l'architecture du CIO Android, architectes cours afin de développer des données d'information et d'interview vidéo!

+ + Renvoi concernent la réponse de lettre privée, « données Andrews » accès libre!

drame américain « famille Goldman, » Parlons-en au sujet de la bataille des gangs et non conventionnelle, fait battre le cur plus vite
Précédent
Hengyang voiture électrique, « trois » modèle de gestion a gagné « le prix de l'innovation » de la province
Prochain
Jouez en mode contrôle: jusqu'à 78 couleurs Zaku
Air peur soudaine de l'embarras, mais heureusement, nous avons un « faux sourire garçon »
générations de devoirs fille de vacances d'hiver, le revenu Wan! Après sa mère connaître un tel accord
Chine Taiwan Public Television et HBO se sont associés pour lancer un « inadapté pour les enfants » drame phénomène
Lecture module de commande: Storm artillerie lourde, un coup fatal
« UI » « nouvelles » 190417 UI « CINE21 section » entretien avec un directeur de la divulgation complète fait l'éloge « IU peut jouer dans l'eau ».
« Rocket Union » Changer modèles en édition exclusive look très beau
Vous recevez un message texte « réponse désabonnement TD », et à la fin de ne pas revenir en arrière? J'ai essayé plus tard ......
Mode de lecture de contrôle: haute couleur grise, Jie Sita
« TFBOYS « » Nouvelles 190417 beau porte-parole de maquillage Wang Yuan, un total de rêve continue d'ouvrir une nouvelle ère de la jeunesse
Petite figure de grande sagesse Avlight compagnon vidéo Little Love A1 Commentaires
Andrews voyage de sécurité - un outil de chiffrement en vrac string (AndStringGuard) a introduit le principe de