From Here to Activity

En Android vivimos en una especie de convertibilidad menemista, sólo que en lugar del “1 a 1″ (un peso argentino era igual a un dólar norteamericano) se trata de una completa identidad entre pantallas y actividades (y todos los argentinos conocemos las consecuencias nefastas de la convertibilidad). Por ejemplo, entonces, si queremos pasar de una actividad a otra debemos hacer el cambio desde la actividad inicial, o eso es lo que uno encuentra por ahí.

Y quizás (porque necesitan hacer algo complejo, porque se los ocurrió, no les queda otra o porque son malabaristas del código) quieran o necesiten cambiar de actividad desde una clase que no herede de Activity, mas no necesariamente una clase de la lógica de la aplicación, por lo que no se estarían haciendo chanchadas. El tema es que si buscan en Google pueden estar en el horno, porque se da por sentado que el cambio se realizará desde una Activity.

La solución no es nada del otro mundo, es más, es una pavada total y pero práctica si se encuentran en la situación mencionada o si simplemente tenían curiosidad. Es una pavada porque es producto del sentido común y la confusión puede derivar de confundir dos clases. El primer parámetro del Intent no es una actividad sino Context, del cual Activity hereda. Y no sólo eso, sino que startActivity no es un metodo de la actividad sino del contexto. Entonces, lo único que hay que hacer para iniciar una actividad desde una clase “normal”, que no herede de Activity es pasarle a la clase el contexto, sea en un metodo o en el constructor. Digamos:

public ClaseIntermediaQueNoHeredaDeActivity(Context context) {
    this.context=context;
}

Y luego

Intent intent = new Intent(context, OtraClase.class);
context.startActivity(intent);

No sucede lo mismo con startActivityResult, ya que este sí pertenece a Activity. Pero ya saben, si necesitan hacer algo loco o raro en Android, aunque se violen las guías (útiles y sencillas pero insisto, inspiradas en el neoliberalismo menemista) de “una actividad, una pantalla”, ya saben.

Leave a Reply