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

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

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

BroadcastReceiver + static переменная - Android

22.04.2016, 14:09. Просмотров 177. Ответов 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
Servise, BroadcastReceiver, Activity Android
Android Как заставить работать BroadcastReceiver?
Как запустить метод в Activity из BroadcastReceiver Android
Как узнать что BroadcastReceiver сообщение зарегистрировано? Android
Android Запуск BroadcastReceiver без активити
Уведомления в BroadcastReceiver Android
BroadcastReceiver, куда добавить код? Android
BroadcastReceiver Android
Android Виджеты, BroadcastReceiver и Строки
Android 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
Сообщений: 113
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 переменная
Ответ Создать тему
Опции темы

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