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

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

Войти
Регистрация
Восстановить пароль
 
 
S4nchez
4 / 4 / 1
Регистрация: 25.08.2015
Сообщений: 56
#1

Как приложение Вконтакте узнаёт о новом сообщении? - Программирование Android

27.09.2016, 16:40. Просмотров 902. Ответов 37
Метки нет (Все метки)

Как реализовать подобную вещь:
как, например, приложение Вконтакте узнаёт о новом сообщение? Оно циклично посылает запрос на сервер с этой целью? Или для этого используется какое-то средство Андроида?
Как возможно это реализовать? Если я хочу в своём приложении встроить что-то типа "оповещения о новых событиях", а информацию о них выкладывать на своём сервере.

Просто, если циклично посылать запрос, то это и на батарею плохо влияет и на расход трафика.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2016, 16:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как приложение Вконтакте узнаёт о новом сообщении? (Программирование Android):

Падает приложение для публикации вконтакте - Программирование Android
public class VkWebViewClient extends WebViewClient { private static final String TAG = "Vkfunc"; public String access; ...

Приложение не может пройти авторизацию вконтакте - Программирование Android
Такая вот проблема , приложение с авторизаций вконтакте на некоторых устройствах проходить всё хорошо к примеру htc one , galaxy alfa ....

Одно приложение вконтакте работает, а второе нет - Программирование Android
Создал одно приложение работает с контактом нормально. Создаю другое приложение, регистрирую вконтакте его, получаю другое id. И потом...

Как на новом планшете снести андроид и поставить нормальный виндовс, как минимум ХР - Программирование Android
???

Как сделать оповещение о новом сообщении. - PHP БД
Здравствуйте подскажите пожалуйста как можно реализовать оповещение о новом сообщение сделал сообщение и что бы новое выходило выше чем...

Как отправить на e-mail сообщение о новом сообщении - PHP БД
Здравствуйте, Мне нужна помощь, я новичок в php, и ещё многого не знаю, но изучаю. Перейду к делу: У меня есть сайт, а на сайте на...

37
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
28.10.2016, 06:34 #16
Bi-do-mi, лично я это не использовал но на 99% уверен что работает это так
- вариант внесения данных номер один - пользователь пишет в нашем приложении например сообщение, приложение кладёт его в базу, класс обслуживающий базу сам отправляет сообщение наверх (база ведь реально находится там и положить в базу равносильно отправке)
- вариант внесения данных номер два - нечто (например наш сайт) размещает например новость напрямую в базе используя её API
- вариант внесения данных номер три - например администратор размешает например уведомление напрямую в базе используя консоль
- что происходит после этого - база сама рассылает данные на устройства и они появляются в нашем приложении - как? - при запуске (при первом запуске или при запуске происходящем в ходе загрузки устройства благодаря наличию у нашего приложения ресивера события загрузки) наше приложение например посылает наверх запрос в котором указывает идентификатор базы (теперь наверху знают что на этом устройстве стоит именно эта база и нужно посылать на это устройство данные изменившиеся именно в этой базе, возможно даже указывается какие именно данные мы хотим получать, возможно даже указывается имя и пароль пользователя для проверки его полномочий, возможно даже разные пользователи имеют право изъявить желание получать только разрешенные им наборы данных) после чего приложение регистрирует ресивер который будет вызываться системой при получении данных сверху: данные приходят (как я понимаю даже на спящий телефон на манер GCM - об этом позаботились аффилированные лица) --> система вызывает ресивер --> наше приложение в той или иной форме использует полученные данные
1
Bi-do-mi
3 / 3 / 0
Регистрация: 19.07.2016
Сообщений: 15
28.10.2016, 09:04 #17
Спасибо за ответ. Но, судя по терминологии ответа, вы мало знакомы с внутренней архитектурой построения кода андроид-приложения и его взаимодействия с Firebase. С посылом данных на сервер нет никаких проблем. Это делается буквально в две-три строчки. А вот с получением данных вы только что описали вариант с созданием фонового сервиса, который периодически делает запросы в базу данных. Глубоко уважаемый Паблито тоже указывал на то, что это делается с помощью сервиса. Как я писал выше, я пробовал реализовать свой собственно выдуманный, но он не работает в условиях, когда приложение выключено (а сервис при этом работает). Я думаю, что он не может получить доступ к базе потому, что для принятия запроса база требует запрос, исходящий от авторизованного пользователя. В моем случае авторизация происходит через существующий гугл - аккаунт. И происходит это в теле основного приложения, который в это время спит. И я не знаю как пройти авторизацию в условиях только фонового сервиса. Там нет для этого инструментов.
Ок, почитал я FCM. Там предлагают свой вариант сервиса под названием FirebaseMessagingService. Он прекрасно принимает уведомления, высланные из консоли FCM, когда приложение выключено. Но совершенно не ясно как посылать нужные обновленные данные из базы данных на устройство АВТОМАТИЧЕСКИ (не из консоли FCM). Тут я должен сказать, что Firebase умеет автоматически скидывать на устройство обновленные данные с сервера, но только при условии, что приложение на устройстве включено и подписано (прослушивает) на эти конкретные данные.
Если все таки реализовать свой сервис, каким-то чудом авторизоваться, то возникает еще один вопрос. В случае с Вконтакте сообщения приходят практически мгновенно после отправки. Для такого быстродействия нужно чтобы фоновый сервис все время прослушивал (делал) запросы в базу. Но это сразу посадит аккумулятор устройства и не даст даже уйти в глубокий сон.
Вот такие дела. Надеюсь я четко сформулировал вопрос.
1
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
28.10.2016, 10:08 #18
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
судя по терминологии ответа, вы мало знакомы с внутренней архитектурой построения кода андроид-приложения и его взаимодействия с Firebase
судя по вашему посту вы вообще не знакомы со всем этим и то что вы читаете не укладывается у вас в голове
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
вы только что описали вариант с созданием фонового сервиса, который периодически делает запросы в базу данных
ваши глаза читают но разум ваш спит - периодические запросы не нужны и я нигде не писал о них - есть ресивер, когда придут новые данные телефон сам проснется и сам вызовет ваш ресивер (при необходимости запустив ваше приложение - только не путайте приложение с тем что вы видите на экране ) известив тем самым вашу программу об интересующим вас событии (обновлении данных).
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
это делается с помощью сервиса. Как я писал выше, я пробовал реализовать свой собственно выдуманный, но он не работает в условиях, когда приложение выключено (а сервис при этом работает)
выпрямите руки и все получится
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
И я не знаю как пройти авторизацию в условиях только фонового сервиса. Там нет для этого инструментов.
RTFM - все там есть
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
Ок, почитал я FCM. Там предлагают свой вариант сервиса под названием FirebaseMessagingService. Он прекрасно принимает уведомления, высланные из консоли FCM, когда приложение выключено. Но совершенно не ясно как посылать нужные обновленные данные из базы данных на устройство АВТОМАТИЧЕСКИ (не из консоли FCM). Тут я должен сказать, что Firebase умеет автоматически скидывать на устройство обновленные данные с сервера, но только при условии, что приложение на устройстве включено и подписано (прослушивает) на эти конкретные данные.
то у вас не проходит запрос из за отсутствия авторизации и нет инструментов что бы обеспечить авторизацию то вдруг ВНЕЗАПНО все работает как описано но вот незадача - нужен ресивер - вы не хотите писать ресивер? в этом все дело?
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
Для такого быстродействия нужно чтобы фоновый сервис все время прослушивал (делал) запросы в базу. Но это сразу посадит аккумулятор устройства и не даст даже уйти в глубокий сон.
Боже, нет даже сил это слышать - не нужно делать все время запросы если нисходящий поток данных обеспечивается системой GCM или Firebase. если же вы хотите использовать свой путь то либо шлите на устройство data SMS пробуждающее его и перехватываемое вашим приложением при помощи ресивера (увы, наверное это будет стоить денег не говоря уже о необходимости наличия связи на борту устройства и потребности знать его номер) либо периодически опрашивайте внешний ресурс (да да да - это будет жрать батарею, поэтому не нужно молотить запросы каждые 5 с - вполне хватит запрашивать раз в 5 минут - не лопнет пользователь от того что узнает что его лайнули на 5 минут позже)
0
Bi-do-mi
3 / 3 / 0
Регистрация: 19.07.2016
Сообщений: 15
28.10.2016, 11:01 #19
Цитата Сообщение от vxg Посмотреть сообщение
судя по вашему посту вы вообще не знакомы со всем этим и то что вы читаете не укладывается у вас в голове

ваши глаза читают но разум ваш спит - периодические запросы не нужны и я нигде не писал о них - есть ресивер, когда придут новые данные телефон сам проснется и сам вызовет ваш ресивер (при необходимости запустив ваше приложение - только не путайте приложение с тем что вы видите на экране ) известив тем самым вашу программу об интересующим вас событии (обновлении данных).

выпрямите руки и все получится

RTFM - все там есть

то у вас не проходит запрос из за отсутствия авторизации и нет инструментов что бы обеспечить авторизацию то вдруг ВНЕЗАПНО все работает как описано но вот незадача - нужен ресивер - вы не хотите писать ресивер? в этом все дело?

Боже, нет даже сил это слышать - не нужно делать все время запросы если нисходящий поток данных обеспечивается системой GCM или Firebase. если же вы хотите использовать свой путь то либо шлите на устройство data SMS пробуждающее его и перехватываемое вашим приложением при помощи ресивера (увы, наверное это будет стоить денег не говоря уже о необходимости наличия связи на борту устройства и потребности знать его номер) либо периодически опрашивайте внешний ресурс (да да да - это будет жрать батарею, поэтому не нужно молотить запросы каждые 5 с - вполне хватит запрашивать раз в 5 минут - не лопнет пользователь от того что узнает что его лайнули на 5 минут позже)
Ок, возможно я туплю, но вопрос надо решить.
RTFM - это конечно сильно. Нопомнило преподавателя в институте. Если подойти к ней с непонятным вопросом она всегда отвечала: "Читайте ГОСТы и СНиПы, там же все написано!".
GCM уже устарел и гугл настоятельно рекомендует использовать вместо него FCM. Не будем вспоминать о ветеранах.
Насчет работает-не работает с элементами внезапности. Я писал о своем собственноручно созданном сервисе, что он работает когда приложение запущено. То есть он отправляет запрос и получает ответ. Но он не работает когда приложение выключено. При чем тут ресивер, если база данных поднимает средний палец на запрос?
Внезапно, при отключенном приложении работает сервис от FCM о котором я писал выше (НЕ МОЙ СЕРВИС). Это грубо говоря коробка, которую ты внедряешь в свое приложение, фиг его знает как он там внутри фунциклирует. В этой коробке предлагается переписать единственный метод при приеме сообщения. Ну то есть как обработать принятые данные. И вот вы тут пишите:
не нужно делать все время запросы если нисходящий поток данных обеспечивается системой GCM или Firebase
Как он обеспечивается? Куда тыкать чтобы инициировать событие отправки из базы на устройство обновлений?
И я вовсе не ленюсь писать ресивер. Только зачем его писать если у меня, вроде как, уже есть ресивер, даже два (один в теле основного приложения, а второй в коробке от FCM).
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
28.10.2016, 11:17 #20
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
Я писал о своем собственноручно созданном сервисе, что он работает когда приложение запущено. То есть он отправляет запрос и получает ответ. Но он не работает когда приложение выключено.
то что вы не можете создать сервис который будет работать когда пользователь покинул приложение (не убил, а именно покинул да простят меня за этот бытовой термин) - ваши сложности не относящиеся к текущей теме. для общего развития - у меня (и у других людей читавших тот самый FM до достижения дзен) сервисы продолжают работать после того как пользователь покидает приложение. более того - если надо они работают даже если пользователь не открывал приложение (система сама поднимает их при наступлении нужного нам события вызывая наш ресивер в котором мы запускаем наш сервис, например, при загрузке устройства или при получении SMS или - ВОТ ОНО - при получении уведомления от Firebase).
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
Как он обеспечивается? Куда тыкать чтобы инициировать событие отправки из базы на устройство обновлений?
как я нафантазировал выше по мотивам беглого чтения манов к Firebase вам нужно лишь послать запрос "окай, Firebase, на этом устройстве есть приложение которое хочет получать для пользователя *** с паролем *** уведомления при изменении данных *** в базе *** " и зарегистрировать свой ресивер (либо прописать ресивер в манифест если это возможно). думаю этого будет достаточно, однако, лично не проверял. просто описал минимальный набор действий которые ТЕХНИЧЕСКИ необходимы для такой штуки
0
Bi-do-mi
3 / 3 / 0
Регистрация: 19.07.2016
Сообщений: 15
28.10.2016, 11:49 #21
А вот то-то и оно! Вы не пробовали делать запрос из сервиса к базе Firebase. А я -то думаю откуда такая бойкая уверенность. Мой сервис прекрасно работает в фоне, я как-бы тоже постиг дзен в этом плане. И запускать приложение при получении сообщения я тоже умею. Не работают запросы
нужно лишь послать запрос "окай, Firebase, на этом устройстве есть приложение которое хочет получать для пользователя *** с паролем *** уведомления при изменении данных ***
вот это действие не работает внутри сервиса.
Ладно, придется мне слать письма на email, чтобы хоть как-то уведомить что пора открывать приложение.
0
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
28.10.2016, 11:55 #22
я весь текст не осилил
можно очень коротко что надо сделать?

пока я понял следующее - есть телефон, надо что-то сделать что бы появилось уведомление, по клику на которое должна стартовать программа?
0
Bi-do-mi
3 / 3 / 0
Регистрация: 19.07.2016
Сообщений: 15
28.10.2016, 12:10 #23
Коротко задача такая. Юзер №1 создает список и выкладывает его в базу данных Firebase. Юзер №2 видит этот список и при желании добавляет себя в него. После этого выключает приложение, а еще лучше перезагружает устройство.
По прошествии какого-то времени Юзер №1 - создатель списка, видит, что его список пополнился участниками. Теперь он помечает галкой тех кому остаться в этом списке, а кому сказать "пока". Остается реализовать механизм оповещения всех участников списка, что же решил Юзер №1 в отношении конкретно его. То есть как Юзеру №2 получить уведомление при отключенном приложении?
0
korshun84
21 / 76 / 17
Регистрация: 08.07.2014
Сообщений: 406
28.10.2016, 12:13 #24
Цитата Сообщение от Bi-do-mi Посмотреть сообщение
Вы не пробовали делать запрос из сервиса к базе Firebase.
Немного упустил суть разговора, но если речь идет о приеме пуша на мобильном устройстве, то из вашего сервиса никакие запросы к "базе Firebase" делать не надо, надо в нем наследоваться от FirebaseMessagingService и он все будет делать сам.
Другой вопрос, что на некоторых реальных устройствах 5-6 версии андроида оно перестает работать, когда телефон спит, но это уже к теме не относится.
0
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
28.10.2016, 12:19 #25
мне кажется тут вообще можно обойтись без FCM, только подписаться на определенные "ветки" в firebase базе
0
Bi-do-mi
3 / 3 / 0
Регистрация: 19.07.2016
Сообщений: 15
28.10.2016, 12:22 #26
Нет, дело не в приеме пуша. Пуш принимать мы умеем. Вопрос в каком месте создать этот самый пуш автоматически при обновлении конкретных данных хранящихся в Firebase Database. Или как его запросить из фонового сервиса. Из консоли FCM писать уведомления вручную тоже умеем. Это не нужно.

Добавлено через 2 минуты
Подписка на ветки Firebase хорошо работает когда приложение запущено или в не на главном экране, но где-то живет. Будут ли работать подписки если вырубить приложение полностью? Мой практический опыт настойчиво утверждает, что нет.
0
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
28.10.2016, 12:25 #27
я такие выверты люблю, это тренирует
то есть задача такая - я должен в сервисе получить оповещение о том, что в базе изменилась информация, для простоты пусть это будет одна запись

чуть позже отпишусь как проверю
0
Bi-do-mi
3 / 3 / 0
Регистрация: 19.07.2016
Сообщений: 15
28.10.2016, 12:51 #28
Как решение, возникла еще одна идея. Раз уж сервис без запуска основного приложения не может получить данные из базы, нужно просто периодически запускать (если оно не запущено) с помощью сервиса само приложение в фоне. Хотя я не знаю есть ли такая возможность. Ну а приложение уже само сделает запрос в базу.
0
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
28.10.2016, 13:54 #29
у меня в одном небольшом приложении есть привязка к firebase databse, там при старте делается
Java
1
2
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Ololo_db_branch");
        reference.addValueEventListener(this);
так я просто создал сервис и вынес эти строки туда интерфейс реализовал в самом сервисе
так все работает нормально, я даже из recent apps смахиваю приложение и все равно работает сервис

то есть я в базе добавляю запись и тут же в логах вижу что срабатотал onDataChange

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

ps: щас пойду на обед и выключу экран телефона, посмотрим сработает ли onDataChange минут через 30

Добавлено через 35 минут
все по-прежнему работает, то есть листенер в сервисе сработал
0
shavuz
110 / 116 / 22
Регистрация: 29.01.2014
Сообщений: 575
28.10.2016, 14:37 #30
сервис может получать данные когда приложение не запущено, на то он и сервис. достаточно один раз запустить приложение. если этого не происходит то значит не правельно сделан сервис.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2016, 14:37
Привет! Вот еще темы с ответами:

Социальные сети: как на MVC 3 можно организовать быстрое уведмомление о новом сообщении - C# MVC
Мне в голову пришло несколько вариантов: 1) организовать запросы со страницы пользователя на сервер в базу данных сообщений через...

Уведомление о новом сообщении - PHP
Всем доброго времени суток! Никак не могу найти варианта где я бы мог видеть свои новые сообщения. Скажите, как сделать уведомления о новом...

Оповещение о новом сообщении - jQuery
Пытаюсь сделать систему оповещения о новых сообщениях. Пока сделано с помощью перезагрузки страницы. Подскажите, как сделать с помощью...

Уведомление о новом входящем сообщении - PHP
Ребят, подкиньте идеи, как организовать уведомление о новом входящем сообщении в виде: Мои Сообщения(+X шт.) - где X, число новых...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
28.10.2016, 14:37
Ответ Создать тему
Опции темы

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