С тех пор как Android представил библиотечные проекты, я преобразовывал свое приложение в библиотеку, чтобы я мог сделать несколько версий с соответствующими настройками (например, бесплатная и профессиональная версия, использующая одну и ту же кодовую базу, но меняющая несколько вещей) .
Изначально у меня были проблемы с разрешением доступа кода проекта библиотеки к полям в моих подпроектах. Другими словами, каждая из моих бесплатных и профессиональных версий содержала класс с несколькими константами, которые библиотечный проект использовал бы для различения определенных функций.
В подпроекте я расширил основную деятельность библиотеки и добавил статический блок инициализации, который использует отражение для изменения значений полей в библиотеке.
public class MyMainActivityProVersion extends MyMainActivity {
public static final String TAG = Constants.APP_NAME + "/SubClass";
static {
try {
ConstantsHelper.setConstants(Constants.class);
} catch (Exception e) {
Log.d(TAG, "--- Constants not initialised! ---");
e.printStackTrace();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
В этом коде ConstantsHelper находится в библиотеке, и я предоставляю Constants.class из моего подпроекта. Это инициализирует константы в проекте библиотеки.
Мой подход работает отлично, за исключением одного конкретного случая использования. Если приложение некоторое время не использовалось и оно «остановлено» операционной системой, статические поля в ConstantsHelper забываются.
Константы должны сбрасываться основным действием (как показано выше), но основное действие даже не запускается, потому что ОС возобновляет другое действие. Результатом этого является то, что инициализация констант забыта, и я не могу повторно инициализировать их, потому что возобновленная деятельность находится в библиотеке (которая не знает о подпроекте).
Как я могу «указать» другим действиям в библиотеке вызывать код из подпроектов при возобновлении? В качестве альтернативы, есть ли способ гарантировать, что некоторый код в моем подпроекте вызывается при каждом резюме?