diferencia y cuándo usar getApplication (), getApplicationContext (), getBaseContext () y someClass.this

121

Soy nuevo en Android y estoy tratando de entender la diferencia entre getApplication(), getApplicationContext(), getBaseContext(), getContext()y someClass.thissobre todo cuándo utilizar los estos métodos en las siguientes líneas de código:

Cuando lanzo un brindis, ¿cuál es la diferencia entre estos y en qué casos los uso?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

lo mismo con las intenciones:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
Pheonix7
fuente
solo manejan el contexto y baseContext. pero me gustaría entender todos sus usos en los 2 contextos. gracias
Pheonix7

Respuestas:

215

Brindis e intención , ambos requieren referencia al contexto . Y getApplication , getApplicationContext , LoginActivity.this y getBaseContext , todos ofrecen referencias al contexto.

Ahora lo que confunde es la declaración de diferentes contextos y su uso específico. Para simplificar las cosas, debe contar dos tipos de contexto disponibles en el marco de Android.

  1. Contexto de la aplicación
  2. Contexto de actividad

El contexto de la aplicación se adjunta al ciclo de vida de la aplicación y siempre será el mismo durante toda la vida de la aplicación. Entonces, si está utilizando Toast , puede usar el contexto de la aplicación o incluso el contexto de la actividad (ambos) porque se puede hacer un brindis desde cualquier lugar dentro de su aplicación y no se adjunta a una ventana.

El contexto de la actividad se adjunta al ciclo de vida de la actividad y puede destruirse si onDestroy()se eleva la actividad . Si desea lanzar una nueva actividad, debe utilizar el contexto de la actividad en su Intención para que la nueva actividad de lanzamiento esté conectada a la actividad actual (en términos de pila de actividades). Sin embargo, también puede usar el contexto de la aplicación para iniciar una nueva actividad, pero luego debe establecer una marca Intent.FLAG_ACTIVITY_NEW_TASKcon la intención de tratarla como una nueva tarea.

Ahora refiriéndose a sus casos:

LoginActivity.this aunque se refiere a su propia clase que extiende la clase de actividad, pero la clase base (Actividad) también extiende la clase de contexto, por lo que puede usarse para ofrecer contexto de actividad.

getApplication() aunque se refiere al objeto Aplicación, pero la clase Aplicación amplía la clase Contexto, por lo que se puede utilizar para ofrecer contexto de aplicación.

getApplicationContext() ofrece contexto de aplicación.

getBaseContext() ofrece contexto de actividad.

Consejos: Siempre que necesite manipular Views, elija Actividad-Contexto , de lo contrario, la Aplicación-Contexto sería suficiente.

waqaslam
fuente
11
así que si lo hago bien, someClass.this, getBaseContext y getContext () son contextos de actividad, mientras que getApplicationContext () y getApplication () son contextos de aplicación.
Pheonix7
El contexto es solo información sobre un entorno, ¿verdad?
committedandroider
Sí, es como la caja de arena que aloja la aplicación
waqaslam
@committedandroider porque el contexto de la actividad contiene información adicional para el tema elegido, por lo que cuando se crean vistas en el código, el tema correcto se aplicará automáticamente. Para obtener más información, puede leer esto
waqaslam
@waqaslam refiriéndose a las clases sdk de Android, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; y getBaseContext()es método de ContextWrapper, getBaseContext() offers activity context.así como Application Contexttambién ... ¿no es así?
Bhuro
26

La respuesta por Waqas es muy clara y completa, sin embargo, me gustaría aclarar aún más la diferencia entre el uso thisvs getBaseContext(), o getApplication()frente getApplicationContext(). Ambos Activityy Applicationno se extienden a Contextsí mismos, pero ContextWrapper, que es un

"La implementación de proxy de Contexteso simplemente delega todas sus llamadas a otro Context".

Ese contexto "real" es lo que obtienes usando getBaseContext().

Entonces, aunque this(para Activity) y getBaseContext()ambos dan el contexto de la actividad,

  • (a) no se refieren al mismo objeto ( this != getBaseContext()) y
  • (b) el contexto de llamada thises un poco menos eficiente, ya que las llamadas pasan por un nivel adicional de indirección. Sin embargo, dudo que haga alguna diferencia práctica.

La misma lógica se aplica a getApplication()frente getApplicationContext().

AlexR
fuente
En lo que getBaseContext()respecta, los desarrolladores de Android de Google sugirieron esto: "No use getBaseContext (), solo use el contexto que tiene". Entonces, en efecto, sugieren que lo use thispara Actividades.
ChuongPham
esta es la explicación más clara getBaseContextque encontré en Internet. ¡¡Gracias!!
q126y
6
LoginActivity.this 

la línea anterior es una Actividad que es obedientemente un Contexto ... esto se usa cuando creas algunos Diálogos de Alerta ... En algunos lugares es obligatorio que uses Contexto de Actividad ...

getApplication()

Lo mismo aquí, el método de creación de texto necesita el contexto y la aplicación se implementa Context

getApplicationContext()

esta es la forma más preferida, ya que Contextpermanece hasta que se cierra la aplicación.

getBaseContext()

este contexto está disponible para widgets y vistas.

Pero todos dan un objeto Context y nada más.

ngesh
fuente
así que en un mensaje de brindis o al crear una intención, todos tienen el mismo efecto aunque usar getApplicationContext () es lo más correcto?
Pheonix7
1
@Hassan Samii: Para Toast, puede usarlo getApplicationContext()para todas las situaciones, pero es preferible que lo use thisal hacer Toast en una actividad.
ChuongPham
0

Class.this se usa si su clase extiende Activity getapplication () usado referir aplicación y la aplicación extiende el contexto de la aplicación getbasecontext () refiera su contexto de contexto de actividad refiera su contexto de ciclo de vida de actividad contexto de la aplicación refiera a su ciclo de vida de aplicación

chandrakant Chaturvedi
fuente