Жизненный цикл BroadcastReceiver — статические переменные

#android #garbage-collection #broadcastreceiver #static-variables

#Android #сборка мусора #broadcastreceiver #статические переменные

Вопрос:

У меня есть класс BroadcastReceiver. У меня объявлено несколько статических переменных, значение которых обновляется с помощью метода onReceive (). Насколько мне известно, статическая переменная будет сохранять свое значение при вызовах onReceive. Есть ли какая-либо возможность, когда я потеряю эти значения (например, мой класс будет выгружен, сбросив статические переменные)? По сути, это некоторые временные переменные, которые мне нужны, чтобы быть доступными для нескольких вызовов onReceive.

Ответ №1:

Из документации для жизненного цикла BroadcastReceiver

Объект BroadcastReceiver действителен только в течение всего времени вызова onReceive (контекст, намерение). Как только ваш код возвращается из этой функции, система считает объект завершенным и больше не активным.

Это не сделает использование статических переменных практичным в том смысле, что система быстро все исправит. Я бы попробовал использовать SharedPreferences путем вызова…

context.getSharedPreferences("MyReceiver", MODE_PRIVATE)

…в onReceive(...) методе получателя (замените "MyReceiver" на какое-нибудь имя, которое имеет смысл для вашего приложения).

Комментарии:

1. Но статические переменные являются переменными уровня класса и не должны очищаться при уничтожении объекта. Пожалуйста, поправьте меня, если я ошибаюсь. Я знаю о getSharedPreferences (), но просто хотел использовать статические переменные, поскольку через некоторое время мне нужно очистить эти переменные, как только моя работа с ними будет завершена, и я не хочу, чтобы они все еще присутствовали в SharedPreferences. Наконец, если это может быть достигнуто с помощью переменных, то я не хочу использовать SharedPreferences. Если этого не может быть, то я определенно выберу SharedPreferences.

2. @Sush: «Но статические переменные являются переменными уровня класса и не должны очищаться при уничтожении объекта». — Итак, «где» переменные класса «существуют», когда уничтожается последний экземпляр этого класса? Они не просто плавают в киберпространстве, ожидая появления другого экземпляра этого класса. Как объясняется в цитате из документов, при onReceive(...) выходе «система считает объект завершенным». В принципе, вы не можете гарантировать, будет ли / когда BroadcastRecever объект будет GC’d. Что касается SharedPreferences , вы можете просто «очистить» их, когда они больше не нужны.

3. @MisterSquonk: Я согласен, что SharedPreferences могут выполнить эту работу. Но я категорически не согласен с тем, что статические переменные будут уничтожены после уничтожения последнего экземпляра класса. Статические переменные инициализируются при загрузке класса в память, то есть при запуске приложения, и остаются в памяти до тех пор, пока класс не окажется в памяти. Это не зависит от того, какие объекты будут использоваться.

4. @Sush: Хорошо, согласен с тем, что статические переменные не уничтожаются после уничтожения последнего экземпляра класса, я неправильно это сформулировал. Я перефразирую ситуацию — после выхода BroadcastReceiver из onReceive() и, возможно, GC’d, если это был последний активный компонент приложения в целом, возрастает опасность, что само приложение может стать целью завершения работы ОС Android при нехватке ресурсов устройства. Если это произойдет, вы потеряете текущие значения, поскольку при следующем запуске приемника приложение будет воссоздано / повторно инициализировано. Однако SharedPreferences сохраняются.

5. @MisterSquonk: Спасибо, что проявили терпение и помогли мне понять. Я понял идею. Еще раз спасибо..

Ответ №2:

Или вы могли бы, конечно, объявить статические переменные в вашем классе activity.

Комментарии:

1. Да, я могу сделать. Но есть ли проблема с объявлением статических переменных внутри BroadcastReceiver ?

2. Не имеет значения, будет ли статическая переменная объявлена в Activity, BroadcastReceiver или классе. Статическая переменная ведет себя так же.