2010-11-08 20 views
168

Esto me ha dejado perplejos, yo estaba usando esto en Android 2.1-r8 SDK:Diferencia entre contexto de actividad y contexto de aplicación

ProgressDialog.show(getApplicationContext(), ....); 

y también en

Toast t = Toast.makeText(getApplicationContext(),....); 

usando getApplicationContext() accidentes tanto ProgressDialog y Toast .... lo que me llevó a esta pregunta:

¿Cuáles son las diferencias reales entre un contexto de actividad y el contexto de la aplicación, a pesar de sh aring la frase 'Contexto'?

+0

Esto es lo que he encontrado http: //stackoverflow.com/questions/1561803/android-progressdialog-show-crashes-with-getapplicationcontext .... – t0mm13b

+11

Esto debería ayudar a aclarar algunas cosas: [Context, What ¿Contexto?] (Http://www.doubleencore.com/2013/06/context/) – toobsco42

+0

posible duplicado de [¿Cuándo llamar contexto de actividad O contexto de la aplicación?] (Http://stackoverflow.com/questions/7298731/when -to-call-activity-context-or-application-context) – n611x007

Respuesta

189

Son instancias de Context, pero la instancia de la aplicación está vinculada al ciclo de vida de la aplicación, mientras que la instancia de la actividad está vinculada al ciclo de vida de una actividad. Por lo tanto, tienen acceso a información diferente sobre el entorno de la aplicación.

Si lee los documentos en getApplicationContext, observa que solo debe usar esto si necesita un contexto cuyo ciclo de vida es independiente del contexto actual. Esto no se aplica en ninguno de sus ejemplos.

El contexto de la actividad presumiblemente tiene cierta información sobre la actividad actual que es necesaria para completar esas llamadas. Si muestra el mensaje de error exacto, podría indicar qué es exactamente lo que necesita.

Pero en general, use el contexto de actividad a menos que tenga una buena razón para no hacerlo.

+1

Obtuve una 'java.lang.reflect.InvocationTargetException' cuando uso 'getApplicationContext', curiosamente, cuando cambié a' this', no se bloqueaba y funcionaba como se esperaba ... por lo tanto, si ambas son instancias de Context , ¿por qué uno no funciona y el otro no? Esta información será de ayuda para otros, espero ... :) gracias por su pronta respuesta ... – t0mm13b

+2

Necesitaría ver la pila de excepción completa para poder decir algo. Sin embargo, como dije, las instancias de contexto tienen información diferente. Presumiblemente, para mostrar un diálogo o una tostada en la pantalla, se necesita información sobre la Actividad que solo tiene la instancia de la Actividad. –

+0

Gracias ... He escrito mi comentario debajo de la pregunta que apunta al problema que estoy teniendo ... :) – t0mm13b

18

Esto obviamente es una deficiencia en el diseño de la API. En primer lugar, el contexto de la actividad y el contexto de la aplicación son objetos totalmente diferentes, por lo que los parámetros del método donde se usa el contexto deben usar ApplicationContext o Activity directamente, en lugar de utilizar el contexto de la clase principal. En segundo lugar, el documento debe especificar qué contexto usar o no explícitamente.

+7

Totalmente de acuerdo. Google dejó caer la pelota en este caso. Es un desastre completo. –

8

La razón por la que pienso es que ProgressDialog se une a la actividad que apuntala la ProgressDialog que el diálogo no puede permanecer después de la actividad se destruye por lo que debe ser pasado this (ActivityContext) que también se destruye la actividad, mientras que la ApplicationContext permanece incluso después de que la actividad se destruye.

+0

Buena respuesta .... –

1

Creo que cuando todo necesita una pantalla para mostrar (botón, diálogo, diseño ...) tenemos que usar la actividad del contexto, y todo no necesita una pantalla para mostrar o procesar (brindis, servicio telefónico, contacto. ..) podríamos utilizar un contexto de aplicación

0

No se puede mostrar una ventana/diálogo de aplicación a través de un contexto que no sea una actividad. Trate de pasar una referencia de actividad válida

94

encontré esta tabla muy útil para decidir cuándo utilizar diferentes tipos de contextos:

enter image description here

  1. una aplicación puede iniciar una actividad de aquí, pero requiere que se cree una nueva tarea. Esto puede adaptarse a casos de uso específicos, pero puede crear comportamientos de backstack no estándar en su aplicación y generalmente no se recomienda ni se considera una buena práctica.
  2. Esto es legal, pero la inflación se realizará con el tema predeterminado para el sistema en el que se está ejecutando, no lo que está definido en su aplicación.
  3. Se permite si el receptor es nulo, que se utiliza para obtener el valor actual de una emisión fija, en Android 4.2 y superior.

Artículo original here.

+1

Archivo del artículo https://web.archive.org/web/20150329210012/https://possiblemobile.com/2013/06/context/ – nmu

+0

¿qué tal obtener los recursos? Creo que será mejor que lo agregues a tu mesa. y puede acceder a recursos con contexto de aplicación. –

0

Utilice getApplicationContext() si necesita algo relacionado con un Contexto que tenga alcance global.

Si usa la Actividad, la nueva instancia de la Actividad tendrá una referencia, que tiene una referencia implícita a la Actividad anterior, y la Actividad anterior no se puede recolectar como basura.

Cuestiones relacionadas