Я потратил некоторое время, читая об этом, и до сих пор не нашел ответа.
У меня есть несколько занятий в одном приложении. Я хотел бы поделиться некоторыми данными между ними, которые не подходят для намерений или сериализованных файлов данных. Я знаю, что могу использовать все приложение для этой цели, но я не до конца понимаю, как оно работает.
Мы назовем мой общий класс приложения «MyApplication», а основное действие - «MyActivity». Я ожидал бы, что, как только приложение начинается с холодного запуска, оно сначала создает и инициализирует MyApplication (вызывая onCreate ()), а затем переходит к созданию и запуску моей активности (MyActivity) (которая была помечена намерением android.intent.action .ГЛАВНЫЙ). Журналы, кажется, подтверждают это.
Но ... если я попытаюсь установить следующую переменную для всей Деятельности, она будет установлена в нуль:
private final MyApplication THISAPP = (MyApplication) getApplication ();
Это необычно, потому что приложение определенно существует на данный момент. (Кроме того, я не могу отложить установку окончательной переменной, пока не будет вызван MyActivity.onCreate () - это запрещено («Окончательное поле ... не может быть назначено»)).
Обратите внимание, что это работает, если я не называю THISAPP "final" и назначаю его в onCreate (). Это, конечно, противоречит цели защиты переменной с помощью «final», и кажется, что это можно сделать.
Итак, почему getApplication () не генерирует ненулевое значение перед onCreate ()? Или это какой-то странный вопрос контекста? (Я обнаружил, что неопределенная ссылка на контекст недействительна, пока onCreate () не завершена, но будет ли это применяться к контексту родительского приложения, как видно из дочерней операции? I ожидал, что родитель уже установил этот набор на тот момент.)
Редактировать: чтобы подчеркнуть, я могу заставить это работать, если я не пытаюсь использовать final и если я не забываю поставить "." перед именем приложения в манифесте (ошибку я сделал и исправил задолго до этого я написал этот вопрос). Просто не ясно, почему getApplication () (или getApplicationContext () в этом отношении) нельзя использовать до onCreate () в дочернем Activity ... если только «это просто так».