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

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

благодаря

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

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

Да.

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

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

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

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

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

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

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

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

  • android.app.AppGlobals

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

  • getInitialApplication

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

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

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

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