logo

Чтение строк XML из статического контекста в Android

Быстрый ответ

Если требуется извлечь содержимое ресурса, прибегните к методу getResourceAsStream(), применяемому в случае ClassLoader:

Java
Скопировать код
InputStream stream = YourClass.class.getClassLoader().getResourceAsStream("путь/к/ресурсу");

Здесь YourClass замените на имя вашего класса, а "путь/к/ресурсу" – на путь к нужному ресурсу. Результатом будет InputStream, обеспечивающий доступ к данным ресурса.

Если же вам требуются ресурсы на Android без участия Activity или Context, обратите внимание на статический контекст приложения.

Визуализация

Вообразите автомат с закусками, и роботизированную руку, извлекающую из него лакомства. Истинная гиковская мечта.

Java
Скопировать код
public class ResourceVendingMachine {
    public static InputStream getSnack(String path) {
        return ResourceVendingMachine.class
                .getResourceAsStream(path);
    }
}

И вот прекрасное решение:

Markdown
Скопировать код
🤖 Автомат с закусками подготовлен: [🍫, 🍪, 🧃]
🦾 Робот-рука выполняет поиск закуски: getSnack("/snack.txt")

Мощь технического прогресса! Печенька извлечена роботизированной рукой из автомата!

Подкласс приложения: Ваша универсальная уловка в Android

  1. Разработайте подкласс приложения Android:

    Java
    Скопировать код
    public class MyApp extends Application {
        private static MyApp instance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            instance = this;
        }
       
        public static MyApp getInstance() {
            return instance;
        }
    }

    В этом случае класс MyApp становится обладателем статического экземпляра приложения.

  2. Пропишите подкласс в AndroidManifest.xml:

    xml
    Скопировать код
    <application
        android:name=".MyApp"
        ...>
    </application>
  3. Используйте статический метод для получения ресурсов:

    Java
    Скопировать код
    public static String getStaticStringResource(int resId) {
        return MyApp.getInstance().getString(resId);
    }

Теперь вы – маг в мире ресурсов Android. Но помните о переполнении памяти и возможных архитектурных сложностях.

Используйте системные ресурсы, как профессионал!

Для доступа к системным ресурсам Android применяйте Resources.getSystem():

Java
Скопировать код
String cancel = Resources.getSystem().getString(android.R.string.cancel);

Этот метод подойдет исключительно для системных ресурсов.

Ситуации, когда статический контекст может оказаться недостаточным

Статический контекст может быть рискованным:

  • Утечка памяти: Статический контекст может привести к утечкам памяти.
  • Жизненный цикл: Он не ведает о жизненном цикле Activity или Fragment.
  • Квалификаторы ресурсов: Предполагаемые квалификаторы ресурсов, например, локаль или размер экрана, могут быть не распознаны.

Отдаём должное ветеранам: Свойства и Наборы Ресурсов

Доступ к свойствам и ресурсам в Java может казаться устаревшим, однако он весьма эффективен:

Java
Скопировать код
Properties props = new Properties();
try (InputStream input = ClassName.class.getClassLoader().getResourceAsStream("config.properties")) {
    props.load(input);
}
String value = props.getProperty("key");

Для локализации прибегайте к наборам ресурсов:

Java
Скопировать код
ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", Locale.US);
String greeting = messages.getString("greeting");

Такие подходы могут оказаться полезными в случаях, когда отсутствует Context.

Полезные материалы

  1. Class (Java Platform SE 8 ) — описание Class от Oracle.
  2. ClassLoader (Java Platform SE 8 ) — подробности о работе ClassLoader.
  3. Properties (Java Platform SE 8 ) — информация о Properties.
  4. Java Practices->Tag or marker interfaces — введение в ресурсы Java.
  5. DZone – Java Basics: Resource Loading — загрузка ресурсов в Java.