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

Soy nuevo en Android y estoy tratando de entender la diferencia entre getApplication() , getApplicationContext( ), getBaseContext() , getContext() y someClass.this y especialmente cuándo usar 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 debo usarlos?

 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 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); 

    Toast and Intent , ambos requieren referencia al contexto . Y getApplication , getApplicationContext , LoginActivity.this y getBaseContext , todos ofrecen referencia al contexto.

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

    1. Contexto de la aplicación
    2. Contexto de la 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. Por lo tanto, si está usando Toast , puede usar el contexto de la aplicación o incluso el contexto de la actividad (ambos) porque se puede generar un brindis desde cualquier lugar dentro de su aplicación y no está adjunto a una ventana.

    El contexto de actividad se adjunta al ciclo de vida de la actividad y se puede destruir si se onDestroy() la actividad en onDestroy() . Si desea iniciar una nueva actividad, debe necesitar usar el contexto de la actividad en su Intención para que la nueva actividad de inicio esté conectada a la actividad actual (en términos de la stack de actividades). Sin embargo, también puede usar el contexto de la aplicación para iniciar una nueva actividad, pero luego debe establecer el indicador Intent.FLAG_ACTIVITY_NEW_TASK con la intención de tratarlo como una nueva tarea.

    Ahora refiriéndose a sus casos:

    LoginActivity.this aunque se refiere a su propia clase que amplía la clase Activity pero la clase base (Activity) también amplía la clase Context, por lo que se puede utilizar para ofrecer el contexto de la actividad.

    getApplication() aunque hace referencia al objeto Application pero la clase Application extiende la clase Context, por lo que se puede utilizar para ofrecer el contexto de la aplicación.

    getApplicationContext() ofrece contexto de aplicación.

    getBaseContext() ofrece un contexto de actividad.

    Sugerencias: siempre que necesite manipular Views , vaya a Actividad-Contexto , de lo contrario, el Contexto de la aplicación sería suficiente.

    La respuesta de Waqas es muy clara y completa, sin embargo, me gustaría aclarar aún más la diferencia entre usar this frente a getBaseContext() , o getApplication() frente a getApplicationContext() . Tanto la Activity como la Application no extienden el Context sí, sino ContextWrapper , que es un

    “Proxying implementación de Context que simplemente delega todas sus llamadas a otro Context “.

    Ese contexto “real” es lo que obtienes al usar getBaseContext() .

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

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

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

     LoginActivity.this 

    la línea de arriba es una Actividad que es obedientemente un Contexto … esto se usa cuando creas algunos AlertDialogs … En algunos lugares es obligatorio que uses el Contexto de Actividad …

     getApplication() 

    Lo mismo aquí, el método de crear texto necesita Contexto y Aplicación en sí implementa el Context

     getApplicationContext() 

    esta es la forma más preferida ya que este Context vive hasta que la Aplicación se apaga.

     getBaseContext() 

    este contexto está disponible para widgets y vistas.

    Pero todos ellos dan un objeto Contexto y nada más …

    Class.this utilizado si su clase se extiende Activity getapplication () utiliza la aplicación de referencia y la aplicación amplía el contexto de la aplicación getbasecontext () refiere su contexto de contexto de actividad refiérase a su actividad contexto de ciclo de vida applicationcontext refiera al ciclo de vida de su aplicación