2012-02-02 21 views
18

¿Puedo usar ApplicationContext para trabajar con SharedPreferences y comenzar, por ejemplo, RemoteService?¿Contexto de aplicación para SharedPreferences?

Lógicamente, creo que puedo. ¿Hay algún matiz en tal enfoque?

+3

¿Qué pasa con esta pregunta? ¿Es demasiado tonto? – user1074896

+0

Creo que no hay personas que hayan visto la pregunta quién puede dar una respuesta :( –

+0

Mira esto, puede ayudar: http://stackoverflow.com/questions/987072/using-application-context-everywhere –

Respuesta

1

Sí, puedes usar getApplicationContext() para eso. Puede usar getApplicationContext() en cualquier lugar donde use getBaseContext() o la palabra clave this cuando se encuentre en una actividad o servicio, excepto en casos muy específicos, como al agregar vistas o cuadros de diálogo a la interfaz de usuario.

Here es un excelente artículo sobre qué es el contexto y qué es lo que hace, lo que definitivamente recomiendo.

10

Debe usar Activity o ServiceContext, es decir, 'this', a menos que tenga una razón clara y contundente para no hacerlo. Solo use ApplicationContext si claramente necesita una referencia al estado global de su aplicación.

De los desarrolladores de Android documentos de la API en ContextWrapper'sgetApplicationContext() método:

En general, esto sólo se debe utilizar si necesita un contexto cuyo ciclo de vida es independiente del contexto actual, que está ligado a la vida útil del proceso en lugar de el componente actual.

y

usando el ApplicationContext (...) [en contraposición a, por ejemplo un contexto de actividad o servicio] puede conducir fácilmente a fugas graves si se olvida de cancelar el registro, desvincular, etc.

Por ejemplo, para recuperar SharedPreferences en un Activity a, por ejemplo cambie los datos mostrados al usuario, use this.getSharedPreferences(...) ya que no hay una razón clara por la que deba acceder al ciclo de vida de la aplicación. Lo mismo, en un Service, use this.getSharedPreferences(...). (Tenga en cuenta que la actividad y servicio son contextos en los que indirectamente se extienden android.content.Context.)

CommonsWare ha escrito una respuesta en profundidad: When to call activity context OR application context? donde hace el caso que llamar getApplicationContext() "is almost always wrong" y se esbozan las pocas excepciones cuándo usarlo :

  • se unen a un Servicio de una actividad.
  • algo tiene que estar vinculado a un contexto con alcance global.

CommonsWare también se vincula a un answer por el ingeniero Marco Android Dianne Hackborn:

La primera regla que le daría: si usted no sabe por qué necesita [contexto de aplicación], es probable que don No lo necesita (...) La única vez que desea usar getApplicationContext() es cuando necesita un Contexto que exista fuera del ciclo de vida de una clase Activity (u otro componente).

Más respuestas sobre el mismo tema con los debates sobre las cuestiones relacionadas con ApplicationContext:

10

como Gunnar Karlsson menciona el uso de ContextWrapper getApplicationContext() es bastante claro que solo debe usar Activity o ServiceContexto a registro/anular el registro su receptor, se unen/desvincular sus servicios (a menos que sea realmente necesario registrarse con los datos estáticos, no un componente particular) para evitar pérdidas de memoria de incertidumbre y para ser seguro, incluso si se olvida a veces para cancelar el registro, el sistema se lo limpiará con advertencias.

Pero, para getSharedPreferences(...) siempre puede usar cualquier ApplicationContext o Context sin ningún problema. El reason Es decir, se ha mencionado claramente

Para cualquier conjunto particular de preferencias (aquí SharedPreferences), hay una sola instancia de esta clase que todos los clientes acción.

Obtener solo una referencia a través del contexto de la aplicación no mantendrá la referencia para siempre. Es solo una referencia a las preferencias a través del contexto de la aplicación como cualquier otra. Por lo tanto, se borrará tan pronto como el usuario haya terminado con él.

Tenga en cuenta que el registro de un receptor a través del contexto de la aplicación se mantendrá como estado global asociado con su aplicación. Por lo tanto, nunca se borrará para ti.

Por favor alguien me corrija si me equivoco.

Espero que esto te ayude.

+2

Me gustaría creer esto, espero que sea correcto –

+0

@Toro, por favor agregue sus hallazgos para apoyar el comentario. Eventualmente, todos los usuarios deberían saber por qué cree que la respuesta anterior Es incorrecto. –

Cuestiones relacionadas