Можно ли получить контекст приложения в проекте библиотеки Android?

Я хотел бы получить контекст приложения, которое ссылается/размещает мою библиотеку во время выполнения внутри одного класса моего проекта библиотеки. Является ли это возможным? Если да, то как?

Спасибо

Обновить Я не хочу, чтобы мой пользователь передавал контекст в параметре моего библиотечного проекта, потому что возможно, что мой библиотечный проект будет вызываться через JNI, и я понятия не имею, как я могу получить контекст в JNI и передать его на уровень Java.


person Haris Hasan    schedule 23.08.2011    source источник
comment
получитьконтекст приложения()?   -  person WarrenFaith    schedule 23.08.2011
comment
Если вы используете свою библиотеку внутри другого проекта, контекст вашей библиотеки будет контекстом проекта. Что вы хотите сделать с контекстом?   -  person Aracem    schedule 23.08.2011
comment
@WarrenFaith: такой метод недоступен в моем проекте библиотеки Android   -  person Haris Hasan    schedule 23.08.2011
comment
@Aracem: мне нужен контекст внутри проекта библиотеки для выполнения определенных операций, но я не хочу просить пользователя явно передавать контекст в каком-либо параметре. Как я могу самостоятельно получить текущий контекст приложения внутри моей библиотеки?   -  person Haris Hasan    schedule 23.08.2011
comment
электрический ток? с getApplicationContext, даже с этим (если вы находитесь в классе, расширяющем активность) Контекст всегда не зависит от ваших библиотек.   -  person Aracem    schedule 23.08.2011
comment
Нет, мой класс не расширяет активность, это простой класс   -  person Haris Hasan    schedule 23.08.2011
comment
возможный дубликат Как мне получить контекст в этом дело?   -  person ingsaurabh    schedule 23.08.2011
comment
@Haris, если ваш класс является простым классом, вам НЕОБХОДИМО явно передать контекст.   -  person Blundell    schedule 23.08.2011


Ответы (5)


Является ли это возможным?

да.

Если да, то как?

Передайте его как параметр.

Я не хочу, чтобы мой пользователь передавал контекст в параметре моему библиотечному проекту, потому что возможно, что мой библиотечный проект будет вызываться через JNI, и я понятия не имею, как я могу получить контекст в JNI и передать его на уровень Java.

Затем выясните, «как [вы] можете получить контекст в JNI и передать его на уровень Java». Я полагаю, что вы передадите его, как и любой другой объект. Как заметил @Blundell, у вас действительно нет другого выбора.

person CommonsWare    schedule 23.08.2011
comment
:) короче говоря, невозможно получить контекст приложения независимо в проекте библиотеки Android. - person Haris Hasan; 23.08.2011
comment
Да, это возможно для приложения или действия, расширяющего класс. Нет, невозможно независимо для любого простого класса Java, включая в обычном проекте Android или библиотечном проекте. вам придется передать его как параметр, как мы постоянно говорим - person Blundell; 23.08.2011

Есть еще один способ добавить класс приложения в проект вашей библиотеки:

/**
 * Base class for those who need to maintain global application state.
 */
public class LibApp extends Application {

  /** Instance of the current application. */
  private static LibApp instance;

  /**
   * Constructor.
   */
  public LibApp() {
    instance = this;
  }

  /**
   * Gets the application context.
   * 
   * @return the application context
   */
  public static Context getContext() {
    return instance;
  }

}

Затем в вашем обычном проекте сделайте реальный класс приложения расширением LibApp:

/**
 * Base class for those who need to maintain global application state.
 */
public class App extends LibApp {

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

}

Убедитесь, что у вас есть «Имя», определенное в AndroidManifest:

<application android:name="App" ...>

и что ваш класс App находится в базовом пакете.

Затем вы можете использовать LibApp.getContext() вашего проекта библиотеки, чтобы получить контекст приложения, использующего библиотеку.

Это может быть не очень хорошим решением, но оно работает для меня. Я делюсь этим, потому что это может быть полезно кому-то еще.

person peceps    schedule 03.11.2011
comment
Привет! Извините, но я думаю, что этот ответ идет в другую точку. Чего хочет @Haris-Hasan, так это иметь доступ к классу вне библиотеки изнутри библиотеки. Возможно, метод в библиотеке хочет получить доступ к ресурсам унаследованного класса или что-то в этом роде. В любом случае, ваш ответ - хороший ответ для синглтона: P - person Dani bISHOP; 10.11.2011
comment
Он сказал: я хотел бы получить контекст приложения, которое ссылается/размещает мою библиотеку во время выполнения внутри одного класса моего библиотечного проекта. Является ли это возможным? Если да, то как? Этот код делает именно это, дает доступ к контексту приложения, которое использует библиотеку. - person peceps; 15.11.2011
comment
Я полагаю, это вопрос интерпретации. У меня есть тот же код, который вы разместили в моей собственной библиотеке, и он решает вопрос... можете ли вы определить свои классы из своей библиотеки. Я думаю, что Харис-Хасан хочет получить доступ ко «чему угодно» из библиотеки. В любом случае, самый простой способ (если он доступен) — это ваш ответ, @peceps. Может быть, общий ответ подразумевал бы размышления? - person Dani bISHOP; 18.11.2011
comment
Извините, что вмешиваюсь, но должен ли класс приложения быть в базовом пакете? - person Maxrunner; 23.08.2012
comment
Уверены ли вы? эквивалент моего приложения находится в другом пакете, и, похоже, он работает. Кроме того, как бы вы вызвали экземпляр приложения, например, из фрагмента? я пытаюсь избежать использования getActivity().getApplicationContext(), так как это, кажется, дает потенциальные утечки. - person Maxrunner; 14.09.2012
comment
@peceps Могу ли я написать что-то вроде этого: public static LibApp getInstance() { return instance; } - person Dr.jacky; 14.05.2015
comment
@peceps Я делаю кое-что в OnCreate() в LibApp. но OnCreate() не срабатывает. Я расширяю свое приложение из LibApp и добавляю приложение в манифест. - person Dr.jacky; 14.05.2015
comment
Принуждение пользователей библиотеки наследовать Application от вашего класса — плохая практика — это создает проблемы множественного наследования и требует создания дополнительного класса для интеграции библиотеки. Лучший способ здесь - иметь какой-то init метод, который будет иметь Context параметр - person Luten; 16.08.2018
comment
Нужно ли для этого добавлять циклическую зависимость от модуля приложения в библиотеке? - person Dmitry; 19.08.2018
comment
Это решение не будет работать, если у нас есть несколько библиотек и всем нужен контекст приложения. - person Bibin Baby; 17.06.2021

Есть еще один способ получить контекст в jni, не передавая параметр и не сохраняя контекст самостоятельно, а используя Android API. Я обнаружил, что есть класс с именем:

  • android.app.AppGlobals

в исходном коде. И статическая функция

  • получить исходное приложение

    может вернуть объект Application. Но его нужно вызывать в основном потоке, а класс скрыт. В любом случае вы можете использовать его, отразив в java. И вы можете просто использовать FindClass() и FindStaticObjectMethod(), чтобы узнать метод и использовать его. Надеюсь, это поможет.

person Lam    schedule 27.11.2013
comment
Приятель, ты теперь мой личный герой. Большое спасибо. Я делаю библиотеку Android для задач сохранения, которые должны быть полностью повторно использованы без какой-либо зависимости ОТ проекта ДО библиотеки, поэтому я не мог просто создать класс приложения внутри моей библиотеки и жестко закодировать его в моем манифесте, что полностью сломало бы возможность повторного использования и вызвать проблемы несовместимости, когда я хотел перенести библиотеку в другие проекты. Кроме того, я планирую выпустить как Open Source, как только смогу, так что это означает, что он не может заставить других людей использовать библиотечный класс Application. Спасибо - person Gabo Alvarez; 22.02.2019
comment

Я бы передал его как параметр или передал бы синглтон в этой библиотеке.

Плохая идея, когда основное приложение приложения расширяет класс приложения библиотеки, потому что в java вы можете расширять класс только один раз. Если ваше приложение требует перехода к другой библиотеке, у вас будут проблемы.

person Sayooj Valsan    schedule 20.07.2015

В соответствии с этот пост вы можете разрешить библиотеке автоматически инициализировать себя контекстом приложения с помощью ContentProvider.

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

ХТН

person Dario Fiumicello    schedule 18.07.2019