Pergunta muito interessante. Eu acho que é principalmente um significado semântico, e também pode ser devido a razões históricas.
Embora nas implementações atuais da Atividade e Serviço do Android getApplication()
e getApplicationContext()
retornem o mesmo objeto, não há garantia de que sempre será esse o caso (por exemplo, em uma implementação específica do fornecedor).
Portanto, se você deseja a classe Application registrada no Manifest, nunca deve chamá-la getApplicationContext()
e transmiti-la ao seu aplicativo, pois pode não ser a instância do aplicativo (que você obviamente experimentou com a estrutura de teste).
Por que getApplicationContext()
existe em primeiro lugar?
getApplication()
está disponível apenas na classe Activity e Service, enquanto que getApplicationContext()
é declarado na classe Context.
Na verdade, isso significa uma coisa: ao escrever código em um receptor de transmissão, que não é um contexto, mas recebe um contexto em seu método onReceive, você pode chamar apenas getApplicationContext()
. O que também significa que você não tem garantia de ter acesso ao seu aplicativo em um BroadcastReceiver.
Ao analisar o código do Android, você vê que, quando anexada, uma atividade recebe um contexto base e um aplicativo, e esses são parâmetros diferentes. getApplicationContext()
delega sua chamada baseContext.getApplicationContext()
.
Mais uma coisa: a documentação diz que, na maioria dos casos, você não precisa subclassificar Application:
Normalmente, não há necessidade de subclasse Application
. Na maioria das situações, singletons estáticos podem fornecer a mesma funcionalidade de uma maneira mais modular. Se o seu singleton precisar de um contexto global (por exemplo, para registrar receptores de transmissão), a função para recuperá-lo poderá receber uma
Context
que seja usada internamente Context.getApplicationContext()
ao construir o singleton pela primeira vez.
Eu sei que essa não é uma resposta exata e precisa, mas ainda assim, isso responde à sua pergunta?
Application
objeto no seu aplicativo.