Estoy trabajando en una aplicación de Android que tiene varias actividades. En él tengo una clase con varios métodos estáticos. Me gustaría poder llamar a estos métodos desde las diferentes actividades. Estoy usando los métodos estáticos para cargar datos de un archivo xml a través de XmlResourceParser. Para crear un XmlResourceParser se requiere una llamada en el contexto de la aplicación. Entonces mi pregunta es, ¿cuál es la mejor manera de obtener una referencia al contexto de la aplicación en los métodos estáticos? Haga que cada actividad lo obtenga y lo pase? Almacenar de alguna manera en una variable global?La mejor manera de obtener un contexto de aplicación en un método estático en Android
Respuesta
La mejor manera sería pasar el objeto Activity como parámetro a las funciones estáticas.
AFAIK, no hay tal método que le proporcione el contexto de la aplicación en el método estático.
No estoy seguro de que esto va a funcionar todo el tiempo, pero funciona para mí ahora:
public class myActivity extends ListActivity
{
public static Context baseContext;
public void onCreate(Bundle savedInstanceState)
{
baseContext = getBaseContext();
}
entonces puede usar la estática en el paquete:
myApplication.baseContext
Hay un puesto en el blog Sane Tricks For InsaneWorld con una respuesta. Dice que puede reemplazar el objeto Aplicación con su propia subclase y luego mantener el contexto de la aplicación estáticamente allí. Puede encontrar un código de ejemplo en la publicación.
La entrada del blog original, - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html
a partir de Android Studio 2.2.2, este enfoque genera una advertencia: "No coloque las clases de contexto de Android en campos estáticos, esto es una pérdida de memoria (y también rompe la ejecución instantánea). Un campo estático va a filtrar los contextos". – WilliamK
@WilliamK hay una excepción a esta regla con el contexto de la aplicación. Vive mientras su aplicación viva para que no se filtre. Sin embargo, ¡no pongas un contexto de actividad en un campo estático! – JensV
Esto debe recibir acceso a applicationContext
desde cualquier lugar que le permite obtener applicationContext
en cualquier lugar que pueda usarlo; Toast
, getString()
, sharedPreferences
, etc. Lo he usado para obtener applicationContext
dentro de métodos estáticos varias veces.
El Singleton:
package com.domain.packagename;
import android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
Inicializar el Singleton en su Application
subclase:
package com.domain.packagename;
import android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
Si no estoy equivocado, esto le da un gancho para applicationContext en todas partes, lo llaman con ApplicationContextSingleton.getInstance.getApplicationContext();
No debería necesitar aclarar esto en ningún momento, ya que cuando se cierra la aplicación, esto conlleva de todos modos.
Recuerde actualizar AndroidManifest.xml
utilizar este Application
subclase:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.domain.packagename"
>
<application
android:allowBackup="true"
android:name=".mApplication" <!-- This is the important line -->
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:icon="@drawable/app_icon"
>
Por favor, hágamelo saber si usted ve algo mal aquí, gracias. :)
No sé si esta es la mejor manera de hacerlo. Pero creo que la inicialización de singletons que necesitan un contexto en la entrada de 'Application' es una buena idea. Si no, debo pasar un 'Contexto' a' SingletonClass.getInstance (Context) 'cada vez que lo llamo y es realmente molesto. – ProtossShuttle
Sí, es un poco molesto, he estado usando clases como estas [gPrefs] (https://gist.github.com/kai-kb/0393e6239db3b90a771c) [gString] (https: //gist.github .com/kai-kb/3da8389513c21a671dbe) para combatir eso hasta cierto punto. – Versa
Este enfoque también genera una advertencia sobre problemas de fuga y ejecución instantánea: "No coloque clases de contexto de Android en campos estáticos (referencia estática a ApplicationContextSingleton que tiene contexto de campo apuntando al contexto); esto es una pérdida de memoria (y también se rompe) Ejecutar). Un campo estático perderá contextos. – WilliamK
- 1. Mejor manera de definir el método estático
- 2. compilador de C#: no se puede acceder método estático en un contexto no estático
- 3. ¿Hay alguna manera de obtener el tamaño de un archivo en .NET usando un método estático?
- 4. Contexto estático en la definición de enumeración
- 5. mejor manera de acceder a la propiedad de clase dentro de un método estático con PHP
- 6. Obtener el contexto de Android en un adaptador
- 7. Bloquear() en un método estático
- 8. Obtener contexto en un servicio
- 9. Variable global en un método estático
- 10. ¿Es posible detectar el contexto de clase en un método estático heredado?
- 11. Anulación de un método estático en Python
- 12. Obtener acceso desde un método estático
- 13. @synchronized en un método estático
- 14. ¿Cuál es la mejor forma de obtener Contexto?
- 15. ¿Cómo obtener getclass(). GetResource() desde un contexto estático?
- 16. "método no estático no puede ser referenciado desde un contexto estático" error
- 17. Acceda al contexto de Android en la aplicación ndk
- 18. Una forma de obtener información no estática del contexto estático
- 19. Anular un método estático
- 20. jmock burlarse de un método estático
- 21. La mejor manera de crear un ícono de aplicación
- 22. Llamar a un método estático en C#
- 23. mejor manera de obtener un bloqueo en php
- 24. ¿La mejor manera de inicializar un contexto de marco de entidad?
- 25. ¿La mejor técnica para obtener el contexto del paquete OSGi?
- 26. Android: getString (R.string) en el método estático
- 27. La mejor manera de demonizar la aplicación Java en Linux
- 28. ¿Qué hace sincronizado en un método estático?
- 29. ¿Qué es un "método estático" en C#?
- 30. ¿Cómo obtener el nombre de la (sub) clase de un método estático en Python?
Posible duplicado de [forma estática para obtener 'Contexto' en Android?] (Http://stackoverflow.com/questions/2002288/static-way-to-get-context-on-android) –