Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 117
#1

BroadcastReceiver + static переменная - Программирование Android

22.04.2016, 14:09. Просмотров 184. Ответов 3
Метки нет (Все метки)

Работая с бродкаст ресивером задался вопросом, как же он всё-таки работает?) Есть следующий код, который фиксирует состояние телефонного звонка, в первую очередь, входящего:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class CallReceiver extends BroadcastReceiver {
 
    private static String mLastState="Unknown last state";
    private String phoneState="Unknown phone state";
    private static boolean incomingCall=false;
 
 
    @Override
    public void onReceive(Context context, Intent intent) {
       phoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if(intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")){
            LOG.debug("Outgoing call");
        }else {
            LOG.debug("Incoming call"+" "+String.valueOf(incomingCall));
        if(!mLastState.equals(phoneState)){
         switch (phoneState){
            case("RINGING"):
                incomingCall=true;
                mLastState="RINGING";
                LOG.debug("RINGING");
                break;
            case("OFFHOOK"):
                if(incomingCall) {
                    mLastState = "OFFHOOK";
                    LOG.debug("OFFHOOK");
                }
                break;
            case("IDLE"):
                if(incomingCall){
                     mLastState="IDLE";                   
                     incomingCall=false;
                     LOG.debug("IDLE");
                }
                break;
          }
         }
        }
    }
}
Если абонент звонит, мы получаем следующие логи:

main: [Incoming call false]
main: [RINGING] - звонит телефон
main: [Incoming call true]
main: [OFFHOOK] - подняли трубку и разговаривают
main: [Incoming call true]
main: [IDLE] - завершили разговор
main: [Incoming call false]

И вот, что меня смутило это состояние статичной переменной incomingCall. Когда первый раз срабатывает бродкаст ([RINGING]) он все переменные инициализирует (incomingCall=false) и затем выполняется onReceive и мы получаем incomingCall=true. При втором срабатывании ([OFFHOOK]) он уже берёт из статичной переменной, а не инициализирует static поле (incomingCall=false); хотя между этими событиями может пройти время и дальше тоже самое происходит с третьим срабатыванием ([IDLE]).

Отсюда вопрос как происходит инициализация переменных при срабатывании броадкастресивера? Что будет со статичными переменными? Инициализирует ли броадкаст переменные каждый раз или срабатывает только метод onReceive?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2016, 14:09     BroadcastReceiver + static переменная
Посмотрите здесь:

BroadcastReceiver - Программирование Android
У меня такой вопрос если я создал ресивер и прописал его в манифесте. Мой ресивер прослушивает определенные интенты. И у меня такой вопрос...

BroadcastReceiver и startActivity - Программирование Android
У меня есть служба и BroadcastReceiver. Когда приходит событие, то я вызываю startService. Если служба не запущена, то она запускается и...

Виджеты, BroadcastReceiver и Строки - Программирование Android
Здравствуйте. Занимаюсь созданием виджета. Делаю что то наподобие нажатия на кнопку. Использую Broadcast. Предполагается ,что после нажатия...

Чтение preferences в BroadcastReceiver - Программирование Android
Доброго времени суток. Сам смысл того что я делаю: есть активити, которая отображает состояние батареи, есть активити настроек и есть...

Servise, BroadcastReceiver, Activity - Программирование Android
Здравствуйте, есть сервис и активити, сервис возвращает данные активити через BroadcastReceiver... все работает отлично, но когда виходиш...

Запуск BroadcastReceiver без активити - Программирование Android
Имеется приложение, включающее в себя единственный класс: public class MyReceiver extends BroadcastReceiver{ @Override ...

BroadcastReceiver, считывание состояние телефона - Программирование Android
Добрый день! Создал вот такой класс, для считывания состояния телефона во время звонка. public class CallReceiver extends...

BroadcastReceiver, куда добавить код? - Программирование Android
помогите понять часть статьи https://habrahabr.ru/post/234425/. добрался до Для работы BroadcastReceiver'а надо добавить немного кода в...

Как запустить метод в Activity из BroadcastReceiver - Программирование Android
Здравствуйте!!! Все до банальности просто и повторяется, по кругу :) Новичок, увлекся Java & Android... Пытаюсь изобразить приложения...

Как поучить/передать данные в/из BroadcastReceiver ? - Программирование Android
Например, есть BroadcastReceiver и есть Сервис. BroadcastReceiver получает различные ресиверы от системы (типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DarkVortex
102 / 68 / 18
Регистрация: 07.07.2014
Сообщений: 239
22.04.2016, 16:27     BroadcastReceiver + static переменная #2
Инициализация статических полей в java происходит при загрузки класса в память, т.е. в тот момент когда создается процесс. И значения ваш класс хранит собственно на протяжении всей жизни процесса. Т.е. если у вас там еще где-то работает сервис, эти поля не сбросятся и не поменяют сами собой значения.
А даже если и сервиса у вас нет, android может не выгружать ваше приложение из памяти, а оставить в фоне, закешировать этот процесс.
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 117
23.04.2016, 10:53  [ТС]     BroadcastReceiver + static переменная #3
DarkVortex, сервиса нет, думаю Вы правы, что скорее всего идёт кеширование процесса, что конечно вносит достаточно хаоса! Получается, что уверенно мы можем утверждать, что только при первом срабатывании будет инициализация, а дальше никаких гарантий нет, может инициализировать, а может подтянуть из кеша. Получается, что надёжнее всего хранить переменные в SharedPreference? Но доставать их оттуда тоже надо время, а в броадкасте вообще нельзя выполнять никаких длительных операций и получается замкнутый круг.
DarkVortex
102 / 68 / 18
Регистрация: 07.07.2014
Сообщений: 239
23.04.2016, 11:55     BroadcastReceiver + static переменная #4
Delphian, SharedPreference можно смело использовать в BroadcastReceiver, он достаточно быстрый. А для действительно длительных операций можно и сервис завести.
Yandex
Объявления
23.04.2016, 11:55     BroadcastReceiver + static переменная
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru