Получение контекста приложения - PullRequest
24 голосов
/ 22 августа 2011

Это может быть простой вопрос, но я просто хотел убедиться, что я прав.

В моем приложении для Android у меня есть конструктор, который использует:

activity.getApplicationContext()

Действие передается в конструктор в качестве параметра.

Проблема в том, что я вызываю этот класс из Службы. Если я сделаю второй конструктор, который принимает Сервис в качестве параметра и использует service.getApplicationContext? Получу ли я тот же контекст приложения?

Ответы [ 6 ]

56 голосов
/ 22 августа 2011

Самый простой способ получить контекст приложения:

Создать класс App, расширяющий android.app.Application

public class App extends Application {
    public static Context context;

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

Измените тег AndroidManifest.xml <application>, чтобы он имел атрибут android:name="your.package.name.App".

В любое время, когда вам нужен контекст приложения, просто получите его из App.context.

Application всегда инициализируется первым, независимо от того, выполняется ли ваш процесс, будь то действие, служба или что-то еще. У вас всегда будет доступ к контексту приложения.

8 голосов
/ 22 августа 2011

Получу ли я тот же контекст приложения?

Да.Вы можете проверить документацию для Android, которую они предоставили

 getApplicationContext()

Возвращает контекст одного глобального объекта Application текущего процесса.

Так что не должноизменить для всего процесса подачи заявки.

Также обратите внимание на следующее:

getApplicationContext() обычно следует использовать, только если вам нужен контекст, жизненный цикл которогоотдельно от текущего контекста, который связан с временем жизни процесса, а не с текущим компонентом.

Исправьте меня, если я ошибаюсь.

Спасибо

2 голосов
/ 22 августа 2011

Существует только один контекст приложения, поэтому вы должны получить тот же самый.Вы можете иметь только один конструктор, который принимает Context, вам не нужно два.Или, если вы хотите убедиться, что вы получаете контекст приложения, а не, скажем, контекст действия, вы можете сделать так, чтобы ваш конструктор принял Application в качестве параметра, равного Context.

1 голос
/ 10 сентября 2017

Я адаптировал ответ Юку с нестатической прямой контекстной ссылкой.

Создать класс domain.company.pseudo.ApplicationName, который расширяет 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;
  }

}

В этом примере мое полное имя пакета приложения: hypersoft.systems.android.starbox.

Теперь измените тег AndroidManifest.xml <application>, чтобы он имел атрибут android:name="hypersoft.systems.android.Starbox", и убедитесь, что файл класса Starbox.java находится в каталоге компонента проекта: starbox.

После всего этого вы можете import hypersoft.systems.android.Starbox, а в своем коде вы можете получить ApplicationContext, позвонив по номеру Starbox.instance.getApplicationContext()

Успешная компиляция с помощью инструментов сборки 26 и API 26 (Android 8.0) с минимальной версией SDK 14 (4.0).

1 голос
/ 22 августа 2011

Вы можете перейти на getApplicationContext(), если хотите получить контекст всего приложения. Если вы хотите получить контекст текущего класса, вы можете использовать getBaseContext().

0 голосов
/ 06 декабря 2013

Контекст приложения добавляет Контекст действия, оба различны. Прогнозирование рискованно. Используйте этот код для использования объекта контекста.

public class App extends Application {
public static Context context;

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

В вашей деятельности и во фрагментах Класс:

Conetext context=App.context;

...