Pobieranie kontekstu aplikacji

To może być proste pytanie, ale chciałem się upewnić, że mam rację.

W mojej aplikacji na Androida mam konstruktor, który używa:

activity.getApplicationContext()

Aktywność jest przekazywana do konstruktora jako parametr.

Problem w tym, że dzwonię do tej klasy z serwisu. Jeśli zrobię drugi konstruktor, który akceptuje usługę jako parametr i używa service.getApplicationContext? Czy otrzymam ten sam kontekst aplikacji?
Author: Brian Tompsett - 汤莱恩, 2011-08-22

6 answers

czy otrzymam ten sam kontekst aplikacji?

Tak. Możesz sprawdzić dokumentację Androida, którą dostarczyli
 getApplicationContext()

Zwraca kontekst pojedynczego, globalnego obiektu aplikacji bieżącego procesu.

Więc nie powinno być zmieniane przez cały proces aplikacji.

Proszę również zwrócić uwagę na to:

getApplicationContext() zasadniczo powinien być używany tylko wtedy, gdy potrzebujesz kontekstu, którego cykl życia jest oddzielony od bieżącego kontekstu, jest to związane z żywotnością procesu, a nie bieżącego komponentu.

Popraw mnie, jeśli się mylę.

Dzięki

 8
Author: bHaRaTh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 19:05:46

Najprostszym sposobem uzyskania kontekstu aplikacji jest:

Utwórz klasę App, która rozszerza android.app.Application

public class App extends Application {
    public static Context context;

    @Override public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }
}

Zmodyfikuj swój znacznik AndroidManifest.xml <application>, aby miał atrybut android:name="your.package.name.App".

Kiedy tylko potrzebujesz kontekstu aplikacji, pobierz go z App.context.

Application jest zawsze inicjowana jako pierwsza, niezależnie od tego, czy Proces jest uruchomiony, czy jest to aktywność, usługa, czy coś innego. Zawsze będziesz mieć dostęp do kontekstu aplikacji.

 55
Author: Randy Sugianto 'Yuku',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 08:08:47

Istnieje tylko jeden kontekst aplikacji, więc powinieneś uzyskać ten sam. Możesz mieć tylko jeden konstruktor, który bierze Context, tak naprawdę nie potrzebujesz dwóch. Lub jeśli chcesz mieć pewność, że otrzymujesz kontekst aplikacji, a nie, powiedzmy, działanie, możesz poprosić konstruktora, aby wziął Application jako parametr, który jest Context.

 2
Author: Nikolay Elenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 07:21:42

Możesz wybrać getApplicationContext() jeśli chcesz uzyskać kontekst całej aplikacji. Jeśli chcesz uzyskać kontekst bieżącej klasy, możesz użyć getBaseContext().

 1
Author: Android Killer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-14 06:48:52

Zaadaptowałem odpowiedź Juku z nie statycznym bezpośrednim odniesieniem kontekstowym.

Tworzy klasę domain.company.pseudo.ApplicationName, która rozszerza android.app.Application.

package hypersoft.systems.android;

import android.app.Application;

public class Starbox extends Application {

  public static Starbox instance;

  @Override
  public void onCreate() {
    super.onCreate();
    instance = this;
  }

}

W tym przykładzie moja pełna nazwa pakietu aplikacji to hypersoft.systems.android.starbox.

Teraz zmodyfikuj swój AndroidManifest.znacznik XML <application> mający atrybut android:name="hypersoft.systems.android.Starbox", i upewnij się, że plik klasy Starbox.java znajduje się w katalogu komponentu projektu: android, a nie starbox.

Po tym wszystkim, możesz teraz import hypersoft.systems.android.Starbox, a w Twoim Kod możesz uzyskać ApplicationContext dzwoniąc Starbox.instance.getApplicationContext()

Pomyślnie skompilowanie za pomocą narzędzi build tools 26 i api 26 (Android 8.0) z min sdk w wersji 14 (4.0).

 0
Author: Hypersoft Systems,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-10 00:18:48

Kontekst aplikacji Dodaj kontekst aktywności oba są różne.Downcasting jest ryzykowny .Użyj tego kodu, aby użyć obiektu kontekstowego .

public class App extends Application {
public static Context context;

    @Override public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }
} 

W twoich działaniach i w klasie fragmentów:

Conetext context=App.context;

 -2
Author: Ashish Saini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 08:30:53