Возможно ли получить контекст приложения в проекте библиотеки Android?
Я хотел бы получить контекст приложения, который имеет ссылку/размещенную мою библиотеку во время выполнения внутри одного класса моего проекта библиотеки. Является ли это возможным? Если да, то как?
Спасибо
Обновление
Я не хочу, чтобы мой пользователь передавал контекст в параметре в проект моей библиотеки, потому что возможно, что проект библиотеки будет вызван через JNI, и я не знаю, как я могу получить контекст в JNI и передать его на уровень Java.
Ответы
Ответ 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. Я обнаружил, что существует класс с именем:
в исходном коде. И статическая функция
-
getInitialApplication
может возвращать объект Application
. Но он должен быть вызван в основном потоке, а класс скрыт.
В любом случае вы можете использовать его, отражая в java. И вы можете просто использовать FindClass()
и FindStaticObjectMethod()
, чтобы узнать метод и использовать его.
Надеюсь, что это поможет.
Ответ 4
В проекте библиотеки добавьте зависимость от вашего основного проекта. В IntelliJ он сделает это для вас, когда вы попытаетесь ссылаться на эту глобальную переменную. В Eclipse я не уверен...
Ответ 5
Я передал бы его как параметр или передал бы ему одноэлемент в этой библиотеке.
Наличие основного приложения для приложения расширяет класс приложения библиотеки - это плохая идея coz в java, вы можете только один раз расширять его из класса. Если ваше приложение требует перехода в другую библиотеку, у вас будут проблемы.
Ответ 6
Согласно этому посту, вы можете позволить библиотеке автоматически инициализировать себя в контексте приложения с помощью ContentProvider
.
В любом случае, будьте осторожны, как описано в комментариях к записи, могут быть недостатки, касающиеся времени загрузки и мгновенного запуска, а также сбои в многопроцессорных приложениях.
НТН