Bardzo interesujące pytanie. Myślę, że ma to głównie znaczenie semantyczne i może być również spowodowane względami historycznymi.
Chociaż w bieżących implementacjach Android Activity i Service getApplication()
i getApplicationContext()
zwracających ten sam obiekt, nie ma gwarancji, że zawsze tak będzie (na przykład w przypadku konkretnej implementacji dostawcy).
Jeśli więc chcesz mieć klasę aplikacji zarejestrowaną w Manifeście, nigdy nie powinieneś wywoływać jej getApplicationContext()
i przesyłać do aplikacji, ponieważ może to nie być instancja aplikacji (czego oczywiście doświadczyłeś w środowisku testowym).
Dlaczego w ogóle getApplicationContext()
istnieje?
getApplication()
jest dostępna tylko w klasie Activity i Service, podczas gdy getApplicationContext()
jest zadeklarowana w klasie Context.
To w rzeczywistości oznacza jedną rzecz: pisząc kod w odbiorniku rozgłoszeniowym, który nie jest kontekstem, ale otrzymuje kontekst w metodzie onReceive, możesz tylko wywoływać getApplicationContext()
. Co oznacza również, że nie masz gwarancji dostępu do aplikacji w BroadcastReceiver.
Patrząc na kod Androida, widzisz, że po dołączeniu aktywność otrzymuje podstawowy kontekst i aplikację, a są to różne parametry. getApplicationContext()
przekazuje połączenie baseContext.getApplicationContext()
.
Jeszcze jedna rzecz: dokumentacja mówi, że w większości przypadków nie trzeba podklasować aplikacji:
Zwykle nie ma potrzeby podziału na klasy Application
. W większości sytuacji statyczne singletony mogą zapewnić tę samą funkcjonalność w bardziej modułowy sposób. Jeśli twój singleton potrzebuje globalnego kontekstu (na przykład, aby zarejestrować odbiorniki rozgłoszeniowe), można odzyskać funkcję,
Context
która będzie używana wewnętrznie Context.getApplicationContext()
podczas pierwszej budowy singletonu.
Wiem, że to nie jest dokładna i precyzyjna odpowiedź, ale czy to odpowiada na twoje pytanie?
Application
obiektu w swojej aplikacji.