PDA

Ver la Versión Completa : [ CONSULTA ] Recuperar un objeto instanciado en otro activity


farrop
17/08/14, 18:31:31
Buenas a todos, soy nuevo programando para Android.
Tengo una consulta, se que en java, haciendo proyector modelo-controlador-vista, se puede hacer referencia en un controlador, a otro controlador que ya fue instanciado!
Entonces me gustaria saber si estando en un activity, instancio una clase, y cargo valores en ella, si puede acceder a esa misma clase instanciada en otro activity para obtener sus valores. Ej:

Princiapl(){
SqlController sqlController = new SqlController();
sqlController.setBaseDatos("Biblioteca");
sqlController.setUser(usuario");
sqlController.setPassword("clave");
//lamo a otro activity
Intent intent = new Intent(Principal.this, Configuracion.class);
Bundle b = new Bundle();
intent.putExtras(b);
startActivity(intent);
}

Configuracion(){
SqlController sqlController;
//Aca quiero recuperar el objeto que instancie el el activity anterior.
//esto seria lo que quieor hacer pero no anda este codigo
Principal principal = getContext().get("principal")
sqlController = principal.sqlController;
}NO se si es factible algo asi, o no, pero si se puede me gustaria que me orienten un poco al respecto.

Gracias

Farrop

kriogeN
17/08/14, 19:18:32
Más o menos es como lo has puesto, aunque hay código que está mal, pero la idea la tienes.

Para pasar objetos entre Activities se hace mediante Bundle, aunque el propio Intent ya tiene un Bundle propio para ello, y puedes insertarle objetos mediante "intent.putExtra(nombre, objeto)". Luego en la Activity destino sería con "getIntent().getXXXExtra(nombre)", donde XXX es el tipo del objeto.

Los tipos nativos como String, Float, Int, etc tienen su propio método (getStringExtra, getFloatExtra, etc), incluso sus versiones en Array (getStringArrayExtra, getFloatArrayExtra, etc..). Ahora bien, el resto de objetos no nativos sólo puedes insertarlos en un Bundle si implementan a Serializable o Parcelable, siendo mucho más recomendable en el caso de Android usar Parcelable. Sin ir más lejos por ejemplo un Bitmap puedes pasarlo mediante un Bundle porque implementan a Parcelable.

Eso si, realmente no es la misma "instancia", porque lo que ocurre en realidad es que el objeto se vuelve a construir en la Activity destino (mediante los métodos que implementa Parcelable o Serializable).

La única forma de que una Activity tenga acceso a un objeto de otra Activity sin recurrir al Parcelable (o Serializable) es que ese objeto sea una variable de clase (es decir, que sea "static"). Pero en Android es muy muy muy poco recomendable recurrir al static para pasar parámetros.

Ahora te digo otra cosa, para el caso que has puesto de un controlador Sql lo que se debe hacer es recurrir a un patrón Singleton, de tal forma que siempre que hagas "SqlController.get()" obtengas la conexión a la base de datos.

farrop
17/08/14, 20:45:23
Muchusimas gracias kriogeN x la pronta respuesta!
He probado con el intent.putExtra(nombre, objeto), y me ha funcionado con el Serializable, pero con el Parcelable me ha dado este error:
Parcelable protocol requires a Parcelable.Creator object called CREATOR on class android.mapa.ClaseGPS
Pero como ya lo haz dicho, no es la misma instancia, sino que se reconstruye el objeto, x lo que no me sirve para lo que quiero hacer, pues necesito modificar la instancia original desde el segundo activity. Utilidades a esto encuentro miles, pero x ahora lo que quiero hacer es:
* Tengo 3 activitis:
- En el Principal, llamo a otro activity configuraciones.
- En Configuraciones modifico unos valores y abro el tercer activity mapa.
- En mapa uso el GPS, y tengo q activarlo, y esperar aveces varios minutos para que me tome señal, y cuando tengo q cambiar alguna configuracion, debo salir del activity Mapa, se me cierra mi conexion del GPS y al volver a entrar OTRA VEZ esperar varios minutos hasta que se reconecte.

Entonces mi idea era instanciar el LocationManager en el activity principal y acceder a ese objeto desde activity_mapa para que no este buscando la conexion cada vez que ingreso a mapa, sino solo la primera vez, pero no se como hacer referencia a este objecto desde mapa, y tampoco quiero activar desde el principio el GPS xq no es la unica funcion del progama y no quiere tenerlo corriendo innecesariamente!

Si teneis alguna idea de como ayudarme os agradecere!

Farrop