Diferencia entre Contexto de Actividad y Contexto de Aplicación

Esto me ha stumped, yo estaba usando esto en Android 2.1-r8 SDK:

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

Y también en

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

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

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

Ambos 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 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 lees los documentos en getApplicationContext , observa que solo deberías usar esto si necesitas 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, puede ser capaz de señalar qué necesita exactamente.

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

He encontrado esta tabla super útil para decidir cuándo utilizar diferentes tipos de contextos:

Introduzca aquí la descripción de la imagen

  1. Una aplicación puede iniciar una actividad desde aquí, pero requiere que se cree una nueva tarea. Esto puede coincidir con casos de uso específicos, pero puede crear comportamientos no estándar de la pila trasera en su aplicación y generalmente no se recomienda o 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á ejecutando, no lo que se define en la aplicación.
  3. Se permite si el receptor es nulo, que se utiliza para obtener el valor actual de una emisión pegajosa, en Android 4.2 o superior.

Artículo original aquí .

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

La razón por la que pienso es que ProgressDialog está unido a la actividad que apoya el ProgressDialog como el diálogo no puede permanecer después de la actividad se destruye por lo que debe ser pasado este (ActivityContext) que también se destruye con la actividad mientras que el applicationcontext sigue siendo incluso después La actividad va.

Creo que cuando todo necesita una pantalla para mostrar (botón, diálogo, diseño …) tenemos que usar la actividad de contexto, y todo no necesita una pantalla para mostrar o procesar (tostada, servicio de telefonía, contacto …) nosotros Podría utilizar un contexto de aplicación

No 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

Use getApplicationContext () si necesita algo vinculado a un Contexto que por sí mismo tendrá alcance global.

Si utiliza Activity, la nueva instancia Activity tendrá una referencia, que tiene una referencia implícita a la antigua Activity, y la antigua Activity no puede ser recolectada.

  • ¿Es posible obtener el contexto de la aplicación en un proyecto de biblioteca de Android?
  • GetContext (). Error getSystemService
  • Cómo comparar los objetos de contexto de las dos actividades diferentes ..?
  • Cómo iniciar una actividad desde un diálogo en Android
  • ¿Cómo llamar a un método de actividad finish () del objeto Application?
  • Uso del contexto para iniciar otra actividad
  • Recuperar Contexto de un fragmento
  • Cambiar el nombre de un archivo en el almacenamiento interno
  • ¿Cómo obtener un método llamado con diferentes parámetros?
  • ¿La mejor práctica para pasar Contexto a clases sin actividad?
  • ¿Cómo pasar el contexto de la aplicación (Android) a una clase Java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.