• ¿Harto de que se pueda pulsar un botón de tu aplicación repetidas veces antes de que se cree la nueva Activity?
  • ¿Harto de tratar de evitar este comportamiento deshabilitando el botón nada más ser pulsado, y que aun así se lancen Activity sin talento?
  • ¿Harto de consultar StackOverflow y la Internet entera para no encontrar una solución que funcione de verdad?

Nosotros también lo estábamos. Concretamente, habíamos estado experimentando este problema durante años. Ahora tenemos la solución.

Como nunca hemos sido unos expertos programadores, y teníamos muchas prisas por sacar mucho trabajo adelante, nos fiábamos del "método Google" para iniciar una nueva Activity:

Intent intent = new Intent(this, NuevaActivity.class);
this.startActivity(intent);

Y aun así... daba igual que la nueva, como la vieja Activity procesaran mucha información, o poca, que marcásemos la nueva Activity como singleTop, que invocásemos al setEnabled(false); del objeto View que llamaba al startActivity(). También hemos de decir que nuestros usuarios son expertos en pulsar varios botones al mismo tiempo, o que les tiemble el dedo y hagan varias pulsaciones muy rápidas sobre el mismo botón, o que debido a la lentitud del hardware chino se desesperen a la hora de completar una tarea y sigan pulsando el mismo botón hasta el infinito y más allá.
Abrir dos o más instancias de una Activity en nuestra aplicación era muy sencillo, hasta que se nos ocurrió convertir la variable de tipo Intent en un field de nuestra clase de tipo Activity padre. Y cada vez que queremos invocar al startActivity(intent);, lo hacemos sólo si el field intent es == null.
Hay que tener cuidado si la Activity padre es una pantalla principal desde la que se pueden iniciar distintas Activity, por que si todos los new Intent() los asociamos con el field que comentaba antes, al querer iniciar la segunda vez la Activity, como intent != null, la aplicación no haría nada. Es decisión del lector de esta entrada saber cuándo hacer que el field intent sea igual a null de nuevo. ¿Quizás en el onResume()? ¿O mejor en el onActivityResult()? ¿Qué tal crear una clase de tipo Activity con este truco y que todas las actividades de la aplicación hereden de esta clase?

A nosotros nos funciona a la perfección, ¿y a ti?

Cualquier mejora a este truco, queja, grito, etc. es más que bienvenida.