Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
#1

Как поучить/передать данные в/из BroadcastReceiver ? - Программирование Android

02.03.2013, 14:32. Просмотров 3219. Ответов 12
Метки нет (Все метки)

Например, есть BroadcastReceiver и есть Сервис.
BroadcastReceiver получает различные ресиверы от системы (типа android.intent.action.PHONE_STATE).
Сервис иногда взаимодействует из BroadcastReceiverом, так вот вопрос, каким образом он взаимодействует?
Я видел много примеров, где для передачи или получения каких-то данных в/из BroadcastReceiver посылаются свои ресиверы. Я немогу понять зачем это? не проще сделать public static переменную и к ней обращатся как с ресивера так и сервиса??

ну например,
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
public class MyReceiver extends BroadcastReceiver {
    public static String action = null;
    public static String command = null;
    
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        action = intent.getAction();
        if(command != null){
            //command set.. todo
        }
    }
 
}
 
public class MyService extends Service {
    
    public void onCreate() {
        if(MyReceiver.action == null){
            //action null ...
        }
        else{
            //action set ...
        }
    }
}
можно же так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как поучить/передать данные в/из BroadcastReceiver ? (Программирование Android):

Как передать данные в EditText - Программирование Android
Есть активность из которой необходимо передать данные в активити планировщика таким образом чтобы они оказались в поле EditText (строка...

Как передать данные в thread? - Программирование Android
Доброго всем дня) Прошу совета. Есть активити. Она запускает сервис,в котором стартует поток, опрашивающий удаленный сервер по заранее...

Как заставить работать BroadcastReceiver? - Программирование Android
Добрый день! Собственно идея: есть стандартный плеер телефона(HTC One m7 Android 4.4.3) и проводная гарнитура с одной кнопкой. Но по...

Как передать данные из Fragments в DialogFragment - Программирование Android
Пробовал с помощью Intent , Bundle , но не получалось (либо руки кривые) . Поможете?

Как передать intent данные в Service? - Программирование Android
Здравствуйте! как передать intent данные в класс с расширением Service? Стандартным способом кажется не получится передать через putextra...

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

12
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.03.2013, 16:50 #2
а как сервису/ресиверу узнать когда нужно эту переменную проверить?)

Добавлено через 12 минут
а броткаст ресивер не может сервис забиндать?
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
02.03.2013, 18:44  [ТС] #3
ну ситуация может быть такая, сервис изменяет переменную в ресивере, потом инициирует броадкаст телефоном... т.е. броадкаст шлет именно телефон, а не сервис.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.03.2013, 19:21 #4
Цитата Сообщение от elf32 Посмотреть сообщение
потом инициирует броадкаст телефоном... т.е. броадкаст шлет именно телефон, а не сервис.
что?Oo

Добавлено через 39 секунд
в сам бродкаст можно данные засунуть.
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
02.03.2013, 19:54  [ТС] #5
А что ОО?
В сервисе, например, делаем вызов:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:111"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

Таким образом, броадкаст шлет не наш сервис. А ресивер получает броадкаст android.intent.action.PHONE_STATE

Добавлено через 1 минуту
А ситуация напрмиер такая, ресивер ловит ВСЕ броадкасты PHONE_STATE, а вот если например звонок был иницирован нашим приложением, то мы уведомляем ресивер путем изменения static переменной.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.03.2013, 21:14 #6
просто шлите обычный броткаст.

Добавлено через 2 минуты
если делать как вы, то между изменением статик переменной и приходом нужного броткаста может прити и не нужный броткаст.

Добавлено через 2 минуты
а то, что вы засунете в свой интент система не копирует в броткаст?

Добавлено через 4 минуты
может этот же интент и используется для броткаста?
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
02.03.2013, 21:31  [ТС] #7
V0v1k, вы в своем репертуаре причем тут интент? я просто пример написал!!! инициировать broadcast может вообще другое приложение, а в нашем приложении, например, просто пользователь сам указал, что нужно что-то делать. Например, пользователь указал в нашем приложении, что он сейчас совершит звонок, соответствуенно у нас нет интента, а мы просто отмечаем в ресивере, что сейчас будет итти именно тот звонок что нам нужен.

Я не ищу решения конкретных задач, я просто хочю понять почему нужно сделать именно так, а не как-то по другому.

если делать как вы, то между изменением статик переменной и приходом нужного броткаста может прити и не нужный броткаст.
ну так пусть и приходит. зачем он нам? нам например, нужно по другому обработать только те бродкасты которые будут поступать после изменения static переменной.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.03.2013, 21:58 #8
ну так и напишите что нужен просто идентификатор ловить броткасты или нет.

Добавлено через 2 минуты
а то я подумал что нужно словить именно то и только тот, что вы отослали после изменения статик переменной, вот и сказал, что между изменением статика и отправки нужного броткаста может придти ненужный и будет воспринят как нужный, а нужный проигнорируется.

всегда пишите конкретную ситуацию...

Добавлено через 16 секунд
для каждой ситуации свои подходы.

Добавлено через 4 минуты
нет универсальный подходов на все случаи жизни....
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
02.03.2013, 22:10  [ТС] #9
а то я подумал что нужно словить именно то и только тот, что вы отослали после изменения статик переменной, вот и сказал, что между изменением статика и отправки нужного броткаста может придти ненужный и будет воспринят как нужный, а нужный проигнорируется.
Этому есть место быть. Но какая раница, что мы изменим static переменную, что отошлем свой бродкаст с уведомлением что сейчас будет нужный бродкаст??
Напрмер, вместо изменения статик переменной, мы отправляем броадкаст с извещанием что сейчас придет именно тот броадкаст что нам нужен, но пока мы инициируем отправку нужного броадкаста, уже кто-то другой его отправил и ресивер получит не тот бродкаст. не так ли?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.03.2013, 22:14 #10
Цитата Сообщение от elf32 Посмотреть сообщение
Напрмер, вместо изменения статик переменной, мы отправляем броадкаст с извещанием что сейчас придет именно тот броадкаст что нам нужен, но пока мы инициируем отправку нужного броадкаста, уже кто-то другой его отправил и ресивер получит не тот бродкаст. не так ли?
нет, мы уже в нужный броткаст запихам флажек аля "да, я тот самый нужный броткаст, обработай меня" и уже никто не вклинится.
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
02.03.2013, 22:44  [ТС] #11
Не, ну это понятно, если в самом броадкасте будет флаг, что это именно тот броадкаст, то да.
Но я рассматриваю пример, когда броадкаст шлет другое приложение, а нашему сервису нужно уведомить нашего ресивера когда и какой бродкаст нужно ловить.
Я имею ввиду броадкаст-уведомление от сервиса ресиверу, что сейчас нужно начать ловить броадкаст который придет не от нас (всё тот же пример со звонком).
Какая разница, что сервис отправит броадкаст-уведомление, что изменит статик переменную? - веть посля этого, пока мы будем инициировать отправку броадкаста другим приложением, там уже может прийти другой броадкаст.

Вот например, http://commandus.com/blog/?p=58 - обработка ussd запросов.
Там для начала перехвата ussd запроса, отправляется свой броадкаст со спец камандами
MAGIC_ON = ":ON"
MAGIC_OFF = ":OFF;("
а почему просто не изменить статик переменную с флагом, что сейчас пойдет наш запрос? а данные запроса сохранить также в статик переменных?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.03.2013, 22:51 #12
не смотрел пример, но это полезно если при изменении ON на OFF нужно не только флажек изменить, а еще и выполнить что-то, или если есть несколько инстансов перехватчика, ведь статик переменная она общая для всех инстансов класа. другии причины на ум не приходят сейчас...
1
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
03.03.2013, 00:30  [ТС] #13
ок. я понял. нужно смотреть по ситуации. спасибо.
0
03.03.2013, 00:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2013, 00:30
Привет! Вот еще темы с ответами:

Как передать данные в Activity из другого класса - Программирование Android
При нажатии на кнопку, создается активити orgAdapter = new OrgAdapter(this, orgs); GridView gridView = (GridView)...

Как передать данные в определенный инстанс класса? - Программирование Android
Проект который я использую https://github.com/chrisbanes/cheesesquare. Я создаю четыре экземпляра класса CheeseListFragment. Я не могу...

Как узнать что BroadcastReceiver сообщение зарегистрировано? - Программирование Android
Использую GCM для диалога. Когда приходит новое уведомление я передаю id принятого сообщения в activity. Нужно сделать проверку получила ли...

Есть класс унаследованный от View - как туда передать данные? - Программирование Android
getIntent() не работает.


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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