Qual é a diferença entre getContext()
, getApplicationContext()
, getBaseContext()
, e " this
"?
Embora essa seja uma pergunta simples, sou incapaz de entender a diferença básica entre eles. Por favor, dê alguns exemplos fáceis, se possível.
android
this
android-context
iCurious
fonte
fonte
Respostas:
View.getContext()
: Retorna o contexto em que a visualização está sendo executada. Geralmente, a Atividade ativa no momento.Activity.getApplicationContext()
: Retorna o contexto para o aplicativo inteiro (o processo em que todas as atividades estão sendo executadas). Use isso em vez do contexto atual da Atividade se precisar de um contexto vinculado ao ciclo de vida de todo o aplicativo, não apenas da Atividade atual.ContextWrapper.getBaseContext()
: Se você precisar acessar um contexto de outro contexto, use um ContextWrapper. O Contexto referido de dentro desse ContextWrapper é acessado via getBaseContext ().fonte
this
egetContext()
nem sempre são iguais, por exemplo, na classe Activity, você pode usarthis
porqueActivity
herda de,Context
mas o métodogetContext()
não está naActivity
classe. @mikedroid @KCRajuA maioria das respostas já cobre
getContext()
egetApplicationContext()
mas getBaseContext () raramente é explicado.O método
getBaseContext()
é relevante apenas quando você tem umContextWrapper
. O Android fornece umaContextWrapper
classe criada em torno de uma existenteContext
usando:O benefício de usar a
ContextWrapper
é que ele permite "modificar o comportamento sem alterar o contexto original". Por exemplo, se você tiver uma atividade chamadamyActivity
, poderá criar umaView
com um tema diferente demyActivity
:ContextWrapper
é realmente poderoso porque permite substituir a maioria das funções fornecidas,Context
incluindo código para acessar recursos (por exemploopenFileInput()
,getString()
), interagir com outros componentes (por exemplosendBroadcast()
,registerReceiver()
), solicitar permissões (por exemplocheckCallingOrSelfPermission()
) e resolver locais de sistema de arquivos (por exemplogetFilesDir()
).ContextWrapper
é realmente útil para solucionar problemas específicos do dispositivo / versão ou para aplicar personalizações pontuais a componentes como Exibições que exigem um contexto.O método getBaseContext () pode ser usado para acessar o Contexto "base" que o
ContextWrapper
envolve. Você pode precisar acessar o contexto "base" se precisar, por exemplo, verificar se é umService
,Activity
ouApplication
:Ou se você precisar chamar a versão "desembrulhada" de um método:
fonte
ContextWrapper
é uma das piores decisões já tomadas pelos desenvolvedores do framework Android. Quando eles perceberam que criaram uma família inteira de Objetos Deus, em vez de fazer a coisa certa e refatorar o código para a Responsabilidade Única, eles adicionaram um truque feio que permitia mudar o comportamento do Contexto, aprofundando a árvore de herança. Engenharia de software ruim é a mais feia. Quanto a nós, desenvolvedores, IMHO ninguém deve usargetBaseContext()
ouContextWrapper
. Se você faz - é um enorme "cheiro de código".CustomToast
código completo . Obrigado :)))fonte
A pergunta "o que é o contexto" é uma das perguntas mais difíceis do universo Android.
O contexto define métodos que acessam recursos do sistema, recuperam ativos estáticos do aplicativo, verificam permissões, executam manipulações da interface do usuário e muito mais. Em essência,
Context
é um exemplo do antipadrão de Objeto de Deus na produção.Quando se trata de que tipo de
Context
uso devemos usar, isso se torna muito complicado, porque, exceto por ser objeto de Deus, a árvore hierárquica dasContext
subclasses viola brutalmente o princípio da substituição de Liskov.Esta postagem do blog tenta resumir a
Context
aplicabilidade das classes em diferentes situações.Deixe-me copiar a tabela principal dessa postagem para garantir a integridade:
fonte
Context
fornece informações sobre oActvity
ouApplication
componentes recém-criados .Relevante
Context
deve ser fornecido aos componentes recém-criados (seja contexto de aplicativo ou contexto de atividade)Como
Activity
é uma subclasse deContext
, pode-se usarthis
para obter o contexto dessa atividadefonte
A partir disso documento
Eu entendi que você deveria usar:
fonte
getApplicationContext ()
getContext () e getBaseContext ()
isto
fonte
A
Context
é:fonte