Em vários bits do código Android, eu já vi:
public class MyActivity extends Activity {
public void method() {
mContext = this; // since Activity extends Context
mContext = getApplicationContext();
mContext = getBaseContext();
}
}
No entanto, não consigo encontrar nenhuma explicação decente sobre qual é preferível e em que circunstâncias deve ser usada.
Seria muito apreciada a orientação sobre a documentação e orientações sobre o que poderia quebrar se a escolhida errada.
android
android-context
Alnitak
fonte
fonte
Respostas:
Concordo que a documentação é escassa no que diz respeito aos contextos no Android, mas você pode reunir alguns fatos de várias fontes.
Esta postagem no blog oficial dos desenvolvedores do Google Android foi escrita principalmente para ajudar a corrigir vazamentos de memória, mas fornece algumas boas informações sobre contextos:
Ler o artigo um pouco mais detalha a diferença entre os dois e quando você pode considerar usar o aplicativo Context (
Activity.getApplicationContext()
) em vez de usar o contexto de Atividadethis
). Basicamente, o contexto do Aplicativo está associado ao Aplicativo e sempre será o mesmo durante todo o ciclo de vida do seu aplicativo, onde o contexto da Atividade está associado à atividade e pode ser destruído várias vezes, pois a atividade é destruída durante as alterações na orientação da tela e tal.Não encontrei nada sobre quando usar o getBaseContext () além de uma postagem de Dianne Hackborn, uma das engenheiras do Google que trabalha no Android SDK:
Isso foi de uma postagem no grupo de notícias de desenvolvedores do Android . Você também pode fazer sua pergunta lá, porque várias pessoas que trabalham no Android monitoram esse grupo de notícias e respondem a perguntas.
Portanto, no geral, parece preferível usar o contexto global de aplicativos sempre que possível.
fonte
Don't use getBaseContext()
. Alguém poderia esclarecer isso?Aqui está o que eu encontrei sobre o uso de
context
:1) No
Activity
próprio, usethis
para aumentar layouts e menus, registrar menus de contexto, instanciar widgets, iniciar outras atividades, criar novoIntent
dentro de umActivity
, instanciar preferências ou outros métodos disponíveis noActivity
.Inflar layout:
Inflar menu:
Registrar menu de contexto:
Instanciar widget:
Iniciar um
Activity
:Instanciar preferências:
2) Para a classe de todo o aplicativo, use
getApplicationContext()
como este contexto existe para a vida útil do aplicativo.Recupere o nome do pacote Android atual:
Vincule uma classe para todo o aplicativo:
3) Para ouvintes e outros tipos de classes do Android (por exemplo, ContentObserver), use uma substituição de contexto como:
onde
this
oucontext
é o contexto de uma classe (atividade etc.).Activity
substituição de contexto:Substituição de contexto do ouvinte:
ContentObserver
substituição de contexto:4) Para
BroadcastReceiver
(incluindo receptor embutido / embutido), use o próprio contexto do receptor.Externo
BroadcastReceiver
:Inline / Incorporado
BroadcastReceiver
:5) Para Serviços, use o próprio contexto do serviço.
6) Para brindes, use geralmente
getApplicationContext()
, mas sempre que possível, use o contexto transmitido de uma atividade, serviço etc.Use o contexto do aplicativo:
Use o contexto passado de uma fonte:
E por último, não use
getBaseContext()
como recomendado pelos desenvolvedores de estrutura do Android.ATUALIZAÇÃO: adicione exemplos de
Context
uso.fonte
OuterClass.this
; veja comentários em stackoverflow.com/questions/9605459/…Eu li esse tópico há alguns dias, me perguntando a mesma pergunta. Minha decisão depois de ler isso foi simples: sempre use applicationContext.
No entanto, encontrei um problema com isso, passei algumas horas para encontrá-lo e alguns segundos para resolvê-lo ... (alterando uma palavra ...)
Estou usando um LayoutInflater para inflar uma exibição que contém um Spinner.
Então, aqui estão duas possibilidades:
1)
2)
Então, eu estou fazendo algo parecido com isto:
O que eu notei: se você instanciar seu linearLayout com o applicationContext, ao clicar no botão giratório em sua atividade, você terá uma exceção não capturada, vinda da máquina virtual da dalvik (não do seu código, é por isso que gastei muito de tempo para descobrir onde estava o meu erro ...).
Se você usar o baseContext, tudo bem, o menu de contexto será aberto e você poderá escolher entre suas opções.
Então, aqui está a minha conclusão: suponho (não o testei mais) que o baseContext é necessário ao lidar com o contextMenu em sua Atividade ...
O teste foi feito com a API 8 e testado em um HTC Desire, android 2.3.3.
Espero que meu comentário não o tenha aborrecido até agora e desejo tudo de bom. Happy coding ;-)
fonte
Primeiro, concordo que devemos usar o appcontext sempre que possível. então "isso" em atividade. eu nunca tive necessidade de basecontext.
Nos meus testes, na maioria dos casos, eles podem ser trocados. Na maioria dos casos, o motivo pelo qual você deseja conhecer um contexto é acessar arquivos, preferências, banco de dados etc. Esses dados são refletidos como arquivos na pasta de dados particulares do seu aplicativo (/ data / data /). Não importa qual contexto você use, eles serão mapeados para a mesma pasta / arquivos, para que você esteja bem.
Foi o que eu observei. Talvez haja casos em que você deve distingui-los.
fonte
Em alguns casos, você pode usar o contexto de atividade sobre o contexto do aplicativo ao executar algo em um encadeamento. Quando o encadeamento conclui a execução e você precisa retornar o resultado à atividade do chamador, você precisa desse contexto com um manipulador.
fonte
Em palavras simples
getApplicationContext()
como o nome do método sugere, seu aplicativo estará ciente dos detalhes gerais do aplicativo, que você pode acessar de qualquer lugar no aplicativo. Assim, você pode fazer uso disso na vinculação de serviço, no registro de transmissão etc.Application context
permanecerá ativo até a saída do aplicativo.getActivity()
outhis
tornará seu aplicativo ciente da tela atual, visível também os detalhes no nível do aplicativo fornecidos porapplication context
. Portanto, tudo o que você deseja saber sobre a tela atualWindow
ActionBar
Fragementmanger
está disponível neste contexto. Basicamente eActivity
estenderContext
. Esse contexto permanecerá ativo até que o componente atual (atividade) esteja ativofonte
O que é um contexto? Pessoalmente, gosto de pensar no Contexto como o estado do seu aplicativo a qualquer momento. O Contexto do aplicativo representa uma configuração global ou básica do seu aplicativo e uma Atividade ou Serviço pode ser construído sobre ele e representa uma instância de configuração do seu Aplicativo ou um estado transitivo para ele.
Se você consultar a fonte android.content.Context, verá que Context é uma classe abstrata e os comentários na classe são os seguintes:
Interface com informações globais sobre um ambiente de aplicativo. Esta é uma classe abstrata cuja implementação é fornecida pelo sistema Android. Ele permite o acesso a
application-specific
recursos e classes, bem como chamadas paraapplication-level
operações como iniciar atividades, transmitir e receber intenções, etc. O que retiro disso é que o Context fornece uma implementação comum para acessar o nível do aplicativo e o nível do sistema Recursos. Os recursos no nível do aplicativo podem estar acessando coisas como recursos[getResources()]
ou ativos de String[getAssets()]
e recurso no nível do sistema é qualquer coisa com a qual você acessaContext.getSystemService().
De fato, dê uma olhada nos comentários sobre os métodos e eles parecem reforçar essa noção:
getSystemService()
: Retorne o identificador para umsystem-level
serviço pelo nome. A classe do objeto retornado varia de acordo com o nome solicitado.getResources()
: Retorne uma instância de recursos para o pacote do seu aplicativo.getAssets()
: Retorne uma instância de recursos para o pacote do seu aplicativo. Vale a pena ressaltar que na classe abstrata Context, todos os métodos acima são abstratos! Somente uma instância de getSystemService (Class) possui uma implementação e isso chama um método abstrato. Isso significa que a implementação deve ser fornecida principalmente pelas classes de implementação, que incluem:Observando a documentação da API, a hierarquia das classes é semelhante a esta:
Contexto
| - ContextWrapper
| - - Aplicação
| - - ContextThemeWrapper
| - - - - Atividade
| - - Serviço
| - - - IntentService
Como sabemos que
Context
ele próprio não está fornecendo nenhum insight, descemos a árvore, observamosContextWrapper
e percebemos que também não há muito. Como o Aplicativo se estendeContextWrapper
, não há muito o que analisar por lá, pois ele não substitui a implementação fornecida peloContextWrapper
. Isso significa que a implementação do Contexto é fornecida pelo SO e oculta doAPI
. Você pode dar uma olhada na implementação concreta do Context, olhando a fonte da classe ContextImpl.fonte
Eu só usei isso e
getBaseContext
quando brindar de umonClick
(noob muito verde para Java e android). Eu uso isso quando meu clicker está diretamente na atividade e preciso usá-logetBaseContext
em um clicker interno anônimo. Acho que esse é o truquegetBaseContext
, talvez esteja retornando o contexto da atividade na qual a classe interna está se escondendo.fonte
MyActivity.this
. Usar o contexto base como você descreve provavelmente não causará problemas, mas está errado.