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
Contextque 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?
Applicationobjeto no seu aplicativo.