Подтвердить что ты не робот

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

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

Спасибо

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

4b9b3361

Ответ 1

Возможно ли это?

Да.

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

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

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

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

Ответ 2

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

/**
 * 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() проект вашей библиотеки, чтобы получить контекст приложения приложения, использующего библиотеку.

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

Ответ 3

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

  • android.app.AppGlobals

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

  • getInitialApplication

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

Ответ 4

В проекте библиотеки добавьте зависимость от вашего основного проекта. В IntelliJ он сделает это для вас, когда вы попытаетесь ссылаться на эту глобальную переменную. В Eclipse я не уверен...

Ответ 5

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

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

Ответ 6

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

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

НТН