Я использую Android Studio и хочу знать каталог приложения где угодно (имеется в виду все нестатические классы).
Дело в том, что я создаю класс под названием «Константы», чтобы суммировать произвольные константы в моем приложении. Все мои константы в настоящее время статичны и общедоступны, за исключением констант, относящихся к каталогу приложения. Я также реализую Serializable для хранения файла констант внутри некоторого файла. Я буду экспортировать и импортировать константы статическими методами внутри класса Constants. Действительно статично :))
Я знаю, что getFilesDir () в классе Context не является статическим, то есть я не могу вызвать что-то вроде MainActivity.getFilesDir (). GetAbsolutePath (), где MainActivity расширяет Activity extends Context.
Я тоже не могу этого сделать:
public transient static MainActivity someActivity = new MainActivity();
public transient static String parentAbsolutePath = someActivity.getFilesDir().getAbsolutePath();
Потому что он создаст новый поток пользовательского интерфейса вне существующего потока пользовательского интерфейса.
Я знаю, что есть простой способ сделать это - передать MainActivity конструктору, например:
class Constants implements Serializable {
public transient static MainActivity mainActivity;
public transient static String parentAbsolutePath;
Constants(MainActivity mainActivity){
this.mainActivity = mainActivity;
this.parentAbsolutePath = mainActivity.getFilesDir().getAbsolutePath();
}
}
Однако создание экземпляра Constants constants = new Constants(this) в MainActivity обременительно, также ему не хватало модульности, и другие классы не могут использовать этот класс без создания экземпляра объекта.
Итак, мой вопрос: есть ли способ получить доступ к каталогу приложения внутри констант класса без необходимости передавать объект с расширенным контекстом?




Короткий ответ: нет, нельзя. Альтернативный обходной путь, используйте класс Application. Пример:
class MyApp extends Application {
public final Constants constants;
public void onCreate() {
constants = new Constants(this);
}
}
и ваш манифест:
<application
android:name = "MyApp">
<activity></activity>
</application>
Для этого можно использовать кинжал. Посмотрите вокруг на предмет внедрения зависимостей. Это тебе поможет.