Eu sou novo para android e eu estou tentando entender a diferença entre getApplication()
, getApplicationContext(
), getBaseContext()
, getContext()
e someClass.this
e 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);
android
android-intent
this
toast
android-context
Pheonix7
fonte
fonte
Respostas:
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.
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 sinalizadorIntent.FLAG_ACTIVITY_NEW_TASK
com 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.fonte
Context
->ContextWrapper
-> 1.Application
& 2.ContextThemeWrapper
->Activity
; egetBaseContext()
é método deContextWrapper
, tãogetBaseContext() offers activity context.
bem comoApplication Context
também ... não é?A resposta por Waqas é muito clara e completa, no entanto eu gostaria de esclarecer melhor a diferença entre usar
this
vs.getBaseContext()
ougetApplication()
vs.getApplicationContext()
. AmbosActivity
eApplication
nãoContext
se estendem , masContextWrapper
, que é umEsse contexto "real" é o que você obtém usando
getBaseContext()
.Portanto, embora
this
(paraActivity
) egetBaseContext()
ambos forneçam o contexto da atividade, elesthis != getBaseContext()
) ethis
é 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()
.fonte
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ê usethis
para Atividades.getBaseContext
que encontrei na Internet. Obrigado!!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 ...
Mesmo aqui, o método make text precisa de contexto e o próprio aplicativo implementa
Context
essa é a maneira mais preferida, pois isso
Context
permanece até que o aplicativo seja encerrado.esse contexto está disponível para widgets e visualizações.
Mas todos eles dão um objeto de contexto e nada mais ..
fonte
getApplicationContext()
para todas as situações, mas é preferível usá-lothis
ao fazer o Toast em uma atividade.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.
fonte