Intereting Posts
Parse Push – как автоматически открыть мероприятие без действий пользователя при получении push на Android Как просмотреть настройки использования аккумулятора в android? Эффект отскока на RecyclerView Android: местоположение Google Maps с низким уровнем использования батареи Как я могу поместить символы utf-16 в текстовый ресурс Android? RecyclerView и DiffUtil – кошмар параллелизма Отключить жестов салфетки, который открывает навигационный ящик в android GetGoogleAppid не удалось загрузить / загрузить невозможно Android Studio Как открыть всплывающее окно на EditText для длительного нажатия в студии Android Ошибка при использовании Robolectric для тестирования ActionBarActivity Cordova media plugin – остановить потоковое нерабочее – release () замораживает устройство Звук Android: смена тона Android: screenOrientation = "портрет" игнорируется в Jellybean Блокировка диалога из кода JNI JQuery mobile отключить содержимое страницы вертикальной прокрутки

Статическая переменная инициализация на M, но не на L из-за применения onCreate (), вызываемого более одного раза

У меня есть приложение, которое имеет класс, полученный из класса Application, и заметили, что его метод onCreate () вызывается несколько раз. В дополнение к этому значение его статических переменных сбрасывается каждый раз, когда вызывается callCreate ().

Такое поведение наблюдается только на M, это не происходит на L. Я пытаюсь выяснить, есть ли его ошибка в M или предполагаемое изменение в M или существует некоторая фундаментальная неотъемлемая проблема с архитектурой приложения, которая неактивна и только сейчас Проявляется с М.

Класс onCreate (), созданный производным классом приложения, вызывается всякий раз, когда вызывается onReceive () приемника вещания. Несколько экземпляров класса Application НЕ создаются – onCreate () вызывается в одном экземпляре объекта, и тот же контекст приложения присутствует повсюду.

Вот некоторые фрагменты кода, демонстрирующие это наблюдение:

public class MyApplication extends Application { public static int debugVal = 5; public MyApplication () { theApp = this; } public void onCreate () { Log.v(TAG, "++++++++++++ onCreate() debugVal: " + debugVal); debugVal = 10; .... public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive (Context context, Intent intent) { Log.v(TAG, "onReceive. debugVal: " + MyApplication.debugVal); ... 

При запуске на Marshmallow выход logcat:

 831-1412/? I/ActivityManager Start proc 2244:com.company.redacted/u0a86 for broadcast com.company.redacted/com.company.redacted2.MyBroadcastReceiver 2244-2244/? V/MyApplication: ++++++++++ onCreate() debugVal: 5 2244-2244/? V/MyBroadcastReceiver: onReceive. debugVal: 10 ... 831-1327/? I/ActivityManager: Start proc 3271.com.company.redacted/u0a86 for broadcast com.company.redacted2/com.company.redacted1.MyBroadcastReceiver 3271-3271/? V/MyApplication: +++++++++++ onCreate() debugVal: 5 .... 

Посмотрите, как onCreate () вызывается более одного раза, и как debugVal потерял значение 10 во второй раз, когда был вызван вызов onCreate (). Когда тот же самый .apk работает на Lollipop, второй вызов onCreate () отсутствует.

Журнал L выглядит следующим образом:

 768-783/? I/ActivityManager: Start proc 2480:com.company.redacted/u0a84 for broadcast com/company.redacted1/com.company.redacted2/MyBroadcastReceiver 2480-2480/? V/MyApplication: +++++++++++ onCreate() debugVal:5 2480-2480/? V/MyBroadcastReceiver: onReceive. debugVal: 10 .... 2480-2480/com.company.redaced1 v/MyBroadcastReceiver: onReceive. debugVal: 10 

Я хотел бы знать, что происходит, и устранить его, но если я не могу, можно ли заменить класс Application некоторым классом singleton, чьи статические переменные гарантированно безопасны и надежны и инициализируются только один раз?

Это предустановленное приложение, которое запускается при загрузке (что является одним из намерений, которое прослушивает приемник) и на данный момент не имеет никаких Актив.

Вы говорите, что onCreate () вызывается дважды в том же процессе, но это, вероятно, неверно. Очень возможно, что Marshmallow более агрессивно относится к убийству вашего процесса, либо из-за меньшего объема памяти, либо просто более агрессивно относится к убийству простаивающих пакетов (см. Эту проблему для упоминания «пустой № 17» и документов, в которых упоминается CACHED_EMPTY ).

Чтобы проверить, сделайте свой сервис передним сервисом, вызвав startForeground с постоянным уведомлением. Если ваши проблемы исчезнут, это означает, что ОС убивает ваш процесс.

В общем, вы не должны полагаться на то, чтобы оставаться в фоновом режиме – сделать инициализацию максимально ленивым и мелкозернистым, а также сделать фоновые операции, такие как широковещательные приемники, как можно дешевле.

Обратите внимание, что в сообщениях журналов, которые вы показали, весь процесс перезапускается, и, следовательно, onCreate вызывается снова, можете ли вы описать, что происходит между двумя событиями, или некоторые детали того, что вы делаете, и что может вызвать убийство Первый процесс и запуск нового?

Статические переменные являются плохими для состояния удержания. Причина этого в том, что статические переменные не сохраняются на протяжении всего жизненного цикла и запуска / завершения приложений. Обычно вы используете только статические переменные для постоянного состояния. Это означает переменные, которые имеют одинаковое начальное значение или являются константами.

Если значение меняется, то оно должно храниться в хранилище, таком как Prefs.


Что касается того, почему вы получаете несколько вызовов OnCreate; Не могли бы вы уточнить, какого рода BroadcastReceiver вы реализуете?

Возможно, что входящее намерение может вызвать изменение конфигурации, которое уничтожит и воссоздает Приложение.