diferença e quando usar getApplication (), getApplicationContext (), getBaseContext () e someClass.this

121

Eu sou novo para android e eu estou tentando entender a diferença entre getApplication(), getApplicationContext(), getBaseContext(), getContext()e someClass.thise especialmente quando usar os estes métodos nas seguintes linhas de código:

Quando inicio um brinde, qual é a diferença entre esses e em quais casos os 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();

mesmo com intenções:

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
fonte
eles lidam apenas com o contexto e baseContext. mas eu gostaria de entender todos os seus usos nos 2 contextos. graças
Pheonix7

Respostas:

215

Toast e Intent , ambos requerem referência ao contexto . E getApplication , getApplicationContext , LoginActivity.this e getBaseContext , todos oferecem referência ao contexto.

Agora, o que confunde é a declaração de diferentes contextos e seu uso específico. Para simplificar, você deve contar dois tipos de contexto disponíveis na estrutura do Android.

  1. Contexto do Aplicativo
  2. Contexto da Atividade

O contexto do aplicativo é anexado ao ciclo de vida do aplicativo e sempre será o mesmo durante toda a vida do aplicativo. Portanto, se você estiver usando o Toast , poderá usar o contexto do aplicativo ou mesmo o contexto da atividade (ambos) porque um brinde pode ser gerado de qualquer lugar do aplicativo e não está anexado a uma janela.

O contexto da atividade é anexado ao ciclo de vida da atividade e pode ser destruído se a atividade onDestroy()for gerada. Se você deseja iniciar uma nova atividade, é necessário usar o contexto da atividade em sua Intenção, para que a nova atividade de inicialização seja conectada à atividade atual (em termos de pilha de atividades). No entanto, você também pode usar o contexto do aplicativo para iniciar uma nova atividade, mas precisa definir o sinalizador Intent.FLAG_ACTIVITY_NEW_TASKcom a intenção de tratá-la como uma nova tarefa.

Agora, referindo-se aos seus casos:

LoginActivity.this embora esteja se referindo à sua própria classe que estende a classe Activity, mas a classe base (Activity) também estende a classe Context, portanto, ela pode ser usada para oferecer contexto de atividade.

getApplication() embora esteja se referindo ao objeto Application, mas a classe Application estenda a classe Context, ela pode ser usada para oferecer o contexto do aplicativo.

getApplicationContext() oferece contexto de aplicativo.

getBaseContext() oferece contexto de atividade.

Dicas: Sempre que você precisar manipular Views, vá para o Contexto da Atividade , caso contrário, o Contexto do Aplicativo será suficiente.

waqaslam
fonte
11
Então, se eu acertar, someClass.this, getBaseContext e getContext () são contextos de atividade, enquanto getApplicationContext () e getApplication () são contextos de aplicativo?
usar o seguinte código
contexto é apenas informações sobre um ambiente, certo?
committedandroider
Sim, é como o sandbox que hospeda o aplicativo
waqaslam
@committedandroider porque o contexto da atividade contém informações extras para o tema escolhido; portanto, quando as visualizações são criadas no código, o tema correto será aplicado automaticamente. Para mais informações, você pode ler este
waqaslam
@waqaslam referente às classes android sdk, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; e getBaseContext()é método de ContextWrapper, tão getBaseContext() offers activity context.bem como Application Contexttambém ... não é?
Bhuro 6/09/16
26

A resposta por Waqas é muito clara e completa, no entanto eu gostaria de esclarecer melhor a diferença entre usar thisvs. getBaseContext()ou getApplication()vs. getApplicationContext(). Ambos Activitye Applicationnão Contextse estendem , mas ContextWrapper, que é um

"A implementação de proxy Contextque simplesmente delega todas as suas chamadas para outro Context".

Esse contexto "real" é o que você obtém usando getBaseContext().

Portanto, embora this(para Activity) e getBaseContext()ambos forneçam o contexto da atividade, eles

  • (a) não se refiram ao mesmo objeto ( this != getBaseContext()) e
  • (b) chamar o contexto thisé um pouco menos eficiente, pois as chamadas passam por um nível extra de indireção. Duvido que faça alguma diferença prática, no entanto.

A mesma lógica aplica-se a getApplication()vs. getApplicationContext().

AlexR
fonte
No que diz getBaseContext()respeito aos desenvolvedores do Google, o Google sugeriu o seguinte: "Não use getBaseContext (), apenas use o contexto que você possui". Portanto, eles sugerem que você use thispara Atividades.
ChuongPham
esta é a explicação mais clara getBaseContextque encontrei na Internet. Obrigado!!
Q126y
6
LoginActivity.this 

a linha acima é uma atividade que é obviamente um contexto .. é usada quando você cria alguns AlertDialogs ... Em alguns locais, é obrigatório o uso do contexto de atividade ...

getApplication()

Mesmo aqui, o método make text precisa de contexto e o próprio aplicativo implementa Context

getApplicationContext()

essa é a maneira mais preferida, pois isso Contextpermanece até que o aplicativo seja encerrado.

getBaseContext()

esse contexto está disponível para widgets e visualizações.

Mas todos eles dão um objeto de contexto e nada mais ..

ngesh
fonte
portanto, em uma mensagem do sistema ou ao criar uma intenção, todos eles têm o mesmo efeito, mesmo que o uso de getApplicationContext () seja o mais correto?
precisa saber é o seguinte
1
@Hassan Samii: Para o Toast, você pode usar getApplicationContext()para todas as situações, mas é preferível usá-lo thisao fazer o Toast em uma atividade.
ChuongPham
0

Class.this usado se a sua classe estender o Application de atividade () usado, consulte o aplicativo e o aplicativo estender o contexto do aplicativo getbasecontext () consulte o contexto do contexto da atividade, consulte o contexto do ciclo de vida da atividade.

chandrakant Chaturvedi
fonte