Diferencia entre el Contexto de la Actividad y el Contexto de la Aplicación


Esto me tiene perplejo, estaba usando esto en Android 2.1-r8 SDK:

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

Y también en

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

Usando getApplicationContext() se bloquea tanto ProgressDialog como Toast.... que me llevan a esta pregunta:

¿Cuáles son las diferencias reales entre un contexto de actividad y un contexto de aplicación, a pesar de compartir la expresión "Contexto"?

Author: Brian Tompsett - 汤莱恩, 2010-11-09

7 answers

Ambas son instancias de Contexto, 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 señala que solo debe usar esto si necesita un contexto cuyo ciclo de vida esté separado del contexto actual. Esto no se aplica en ninguno de sus ejemplos.

El contexto de Actividad presumiblemente tiene alguna información sobre la actividad actual que es necesaria para completar esas llamadas. Si muestra el mensaje de error exacto, podría ser capaz de apuntar a lo que necesita exactamente.

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

 206
Author: Cheryl Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-08 22:33:52

Encontré esta tabla súper útil para decidir cuándo usar diferentes tipos de Contextos:

introduzca la descripción de la imagen aquí

  1. Una aplicación PUEDE iniciar una actividad desde aquí, pero requiere que se cree una nueva tarea. Esto puede adaptarse a casos de uso específicos, pero puede crear comportamientos de back stack 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 hará con el tema predeterminado para el sistema en el que se están ejecutando, no lo que está definido en su aplicación.
  3. Permitido si el receptor es null, que se utiliza para obtener el valor actual de una transmisión adhesiva, en Android 4.2 y superior.

Artículo original aquí .

 117
Author: commonSenseCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-25 13:58:52

Esto obviamente es una deficiencia del diseño de la API. En primer lugar, el Contexto de Actividad y el contexto de 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 usar el Contexto de la clase padre. En segundo lugar, el departamento de Comercio debería especificar explícitamente qué contexto utilizar o no.

 23
Author: lucas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-30 09:52:52

La razón que creo es que ProgressDialog se adjunta a la actividad que apoya el ProgressDialog ya que el diálogo no puede permanecer después de que la actividad se destruye, por lo que debe pasarse this (ActivityContext) que también se destruye con la actividad, mientras que el ApplicationContext permanece incluso después de que la actividad se destruye.

 11
Author: user2779311,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 10:59:52

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

 1
Author: Dmobile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-04 06:03:44

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

 0
Author: Xar E Ahmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-09 12:06:10

Use getApplicationContext() si necesita algo vinculado a un Contexto que a su vez tendrá un alcance global.

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

 0
Author: Dhiraj Himani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-04 05:59:44