android - programacion - ¿Cómo obtener mi contexto de actividad?
manual de programacion android pdf (7)
Realmente no entiendo la idea detrás de cómo funciona todo esto, así que si tengo alguna clase A
que necesita el contexto de una clase B
que amplía la Activity
, ¿cómo obtengo ese contexto?
Estoy buscando una forma más eficiente que dar el contexto como un parámetro al constructor de clase A
Por ejemplo, si la clase A
va a tener millones de instancias, terminaríamos teniendo millones de punteros redundantes en Context
mientras que de alguna manera podríamos tener solo uno en alguna parte y una función getter ...
En Kotlin será:
activity?.applicationContext?.let {
it//<- you context
}
La mejor y más fácil forma de obtener el contexto de la actividad es poner .this
después del nombre de la Actividad. Por ejemplo: si el nombre de su Actividad es SecondActivity
, su contexto será SecondActivity.this
Ok, daré un pequeño ejemplo sobre cómo hacer lo que pides
public class ClassB extends Activity
{
ClassA A1 = new ClassA(this); // for activity context
ClassA A2 = new ClassA(getApplicationContext()); // for application context.
}
Puede crear un constructor utilizando el parámetro Contexto de la clase A, luego puede usar este contexto.
Contexto c;
A (Contexto contextual) {this.c = context}
De la actividad B usted crea un objeto de clase A usando este constructor y pasando getApplicationContext ().
Puede usar la clase de Application
(clase pública en el paquete android.application), es decir:
Clase base para aquellos que necesitan mantener el estado global de la aplicación. Puede proporcionar su propia implementación especificando su nombre en la etiqueta de AndroidManifest.xml, lo que hará que la clase se cree una instancia cuando se crea el proceso para su aplicación / paquete.
Para usar esta clase hazlo:
public class App extends Application {
private static Context mContext;
public static Context getContext() {
return mContext;
}
public static void setContext(Context mContext) {
this.mContext = mContext;
}
...
}
En tu manifiesto:
<application
android:icon="..."
android:label="..."
android:name="com.example.yourmainpackagename.App" >
class that extends Application ^^^
En la actividad B:
public class B extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sampleactivitylayout);
App.setContext(this);
...
}
...
}
En la clase A:
Context c = App.getContext();
Nota :
Normalmente no hay necesidad de subclasificar la aplicación. En la mayoría de las situaciones, los singleton estáticos pueden proporcionar la misma funcionalidad de una manera más modular. Si su singleton necesita un contexto global (por ejemplo, para registrar receptores de difusión), la función para recuperarlo puede tener un Contexto que internamente utiliza Context.getApplicationContext () cuando construye el singleton por primera vez.
Si necesita el contexto de A en B, necesita pasarlo a B, y puede hacerlo pasando la Actividad A como parámetro como otros sugirieron. No veo mucho el problema de tener las muchas instancias de A que tienen sus propios indicadores para B, no estoy seguro de si eso sería incluso una sobrecarga.
Pero si ese es el problema, una posibilidad es mantener el puntero a A como una clase de clase de aplicación global, como lo sugirió @hasanghaforian. De hecho, dependiendo de para qué necesita el contexto, incluso podría usar el contexto de la Application
.
Sugiero leer este artículo sobre el contexto para descubrir mejor qué contexto necesitas.
pasas el contexto a la clase B en su constructor, y asegúrate de pasar getApplicationContext () en lugar de a activityContext ()