Contextos de Android
SeguroquealgunaveztehaocurridoelmaldemuchosprogramadoresAndroid,creerque
elContextosirveparaalgoyaplicarlocadavezqueunaclaseounmtodolopidesinsaber
muybienparaqusirverealmente.Vamosaintentarexplicarenesteanexoesteconcepto
unpocoenrevesado.
LadefinicindeunContextodeAndroidesqueesunsimpleContexto,esdecir,cumpleala
perfeccin el segundo significado que figura en el diccionario de la RAE (Definicinde
contextoenlaRAE):
Enconcreto,elcontextoleindicaaunobjetosuscaractersticasactuales,dequien
depende,etctera.
Tipos de Contexto
EnAndroidexistendostiposdecontextos:
Aplicacin: una aplicacin tiene un nico contexto que engloba a todos contextos
delasActividades,Servicios,etcteraquecontiene.Paraaccederaestecontextode
aplicacin desde unaActivity oun Service podemos escribir laorden
getApplication(). Desde otra clase cualquiera que se herede de Context
utilizaremoslaorden getApplicationContext().
IMPORTANTE: siunaActividadoServiciosedestruye,suContextodesaparece,esdecir,el
Contextoestligadoalciclodevidadelelementoalqueestasociado.
Alaccederalosrecursoscomoimgenes,Strings,etcteradelaaplicacin:
contexto.getResources().getDrawable(R.drawable.imagen_de_recursos);
Alcrearnuevos Views,Listeners,Adapters,Intents,etctera.Porejemplo:
AlaccederdirectamenteacomponentescomoActionBar,Intents,etctera:
2
contexto.getIntent();
Acontinuacin,vamosavercmoobtenerelContextodependiendodeltipodeelemento
deAndroidenelqueestemostrabajando:
ClasequeseheredadeContext(comoActivity oService):this
ClasequeseheredadeContextdesdeunaclaseannima: ClaseActivity.this
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Context contexto = MainActivity.this;
}
});
}
}
ClasequeNOseheredadeContext(porejemplo,seheredadesdeView):
mi_view.getContext()
PuedesobservarquelaclaseButton noseheredadeContext:
As,obtenemoselcontextodondeestasociadoelbotn.
Aplicacin(desdecualquierclaseheredadadeContext):getApplicationContext()
Actividad delFragmentoquelocontiene(desdeunFragment):getActivity()
@Override
public void onAttach (Activity activity) {
super.onAttach(activity);
Context contexto = getActivity();
}
}
Esteefectosucedeporladoblereferenciaexistentecuandounobjetoapuntaaotroobjeto
y el Garbage Collection(recolector de basura de Java, para la liberacin automtica de
memoria)nopuedeeliminardichosobjetos,loque,asuvez,implicanopoderliberaresa
memoria.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (sFondoDelTexto == null) {
sFondoDelTexto = getDrawable(R.drawable.mi_imagen);
}
label.setBackgroundDrawable(sFondoDelTexto);
setContentView(label);
}
}
Parasolucionaresteproblemalomejoresutilizarelcontextodelaaplicacinmediantelas
rdenes Context.getApplicationContext() ocon Activity.getApplication() yaque
noest asociado alciclodevida delaActivity. As, aldestruirse elContext dela
Activity quedarlibrecuandotengaqueserdestruidaypodrserrecolectada:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (sFondoDelTexto == null) {
sFondoDelTexto = getDrawable(R.drawable.mi_imagen);
}
label.setBackgroundDrawable(sFondoDelTexto);
setContentView(label);
}
}
TambinhayquetenercuidadoalcrearunaclaseSingletonqueguardenuestroContext.
Elpatrndediseosingleton(instancianica)estdiseadopararestringirlacreacinde
objetospertenecientesaunaclaseoelvalordeuntipoaunnicoobjeto.
Suintencinconsisteengarantizarqueunaclaseslotengaunainstanciayproporcionar
unpuntodeaccesoglobalaella.
ElejemplotpicoenJavaeselsiguiente:
ParacorregiresteproblemasepuedeusardenuevoelContext delaaplicacin:
return sInstancia;
}
Conclusin:hayquetenercuidadoalcrearvariablesestticasenunaclaseAndroidyaque,siestn
indirectamente asociadas a un Contexto, y ste se debe destruir (Actividad o Servicio), podramos
provocar un fallo de prdida de memoria. En estos casos, lo mejor es utilizar el Contexto de la
aplicacin. Adems, siempre es bueno pasar el contexto entre clases de Android cuando sea
necesarioenlosmtodoscorrespondientes.
Fjateenesteejemplodecdigofuentedonde,enunaclaseextendidade ArrayAdapter,
pasamoselContextocomoparmetroyloguardamoscomounapropiedadnoestticadelaclase:
Activity contexto;
private Opcion[] datos;
...