powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Android [игнор отключен] [закрыт для гостей] / Сохранить данные от FirebaseMessagingService в то время бездействия приложения
5 сообщений из 5, страница 1 из 1
Сохранить данные от FirebaseMessagingService в то время бездействия приложения
    #40127159
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, у меня мобильное приложение на Kotlin у которого логика работы следующая.
Есть Activity, в new Fragment cо списком RecycleView. С другого web-приложения я с помощью REST API (https://fcm.googleapis.com/fcm/send)посылаю notification на конкретное устройство. Notification содержит id элемента, которое нужно подгрузить из мобильного приложения через POST запрос.
Для того, чтобы пробрасывать информацию от сервиса в Activity использую синглтон с LiveData(если есть получше вариант подскажите плиз- везде пишут, что нужно BroadCastReceiver или Intent, но в официальных гугловских доках пишут, что они уже deprecated)
Если приложение активно, то все работает нормально-push приходит, в Activity все пробрасывается.
Проблема в том, что если Activity закрыто или находится в свернутом режиме, FirebaseMessagingService все равно работает и получает сообщения, но пробросить в Activity не может. Управлять в ручном режиме FirebaseMessagingService тоже нельзя.
Как хотелось бы:
из web клиента с помощью rest api отправляется notification и мобильное приложение его принимает только в случае двух состояний- когда оно открыто или свернуто. Если экземпляр приложения не запущен, то notification не принимаются, хранятся в очереди на google сервере, а ждут момента когда мобильное приложение откроется. Это можно было бы достичь, если привязать жизненный цикл FirebaseMessagingService к жизненному циклу Activity, но прокурив форумы я узнал, что для Android это типа что-то вроде более привилегированного сервиса и он будет периодически сам его поднимать.
Код: 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.
///класс для передачи события получения push-уведомления из сервиса в Activity
object Events {
    val newJobReceived: MutableLiveData<Int> by lazy {
        MutableLiveData<Int>()
    }
}
class JobFireBaseMessagingService() : FirebaseMessagingService() {
    
    private  val _jobAddedLiveData= MutableLiveData<Int>()
    val jobAddedLiveData: LiveData<Int> = _jobAddedLiveData

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if (remoteMessage.data.isNotEmpty()) {
      
           val jobId= remoteMessage.getData().get("id")

            if (jobId!==null){
                Events.newJobReceived.postValue(jobId.toInt())
                var builder = NotificationCompat.Builder(this, "CHANNEL_ID")
                    .setContentTitle("Notificationbrbri")
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            }
        }
    }

    override fun onNewToken(token: String) {
        val sharedPreference = getSharedPreferences("aerocl", Context.MODE_PRIVATE)
        val editor = sharedPreference.edit()
        editor.putString("fcmid",token)
        editor.apply()
        super.onNewToken(token)
    }
}

///Это в Fragment-когда получаем уведомление из FirebaseMessagingService, говорим viewmodel, чтобы она по http получила данные 
     Events.newJobReceived.observe(this, Observer<Int> { jobID ->
          _viewModel.getJob(jobID)
       })


Спасибо
...
Рейтинг: 0 / 0
Сохранить данные от FirebaseMessagingService в то время бездействия приложения
    #40127178
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
складывай полученные данные в очередь - например в табличку в БД. Если использовать jetpack room, то и костыль в виде статического LiveData в сервисе не понадобится - сервис только пишет в базу через дао, а во fragment будет получать автоматические изменения через LiveData из базы - хоть во время работы, хоть при восстановлении из фона. Главное не забывать удалять данные после обработки из очереди.
...
Рейтинг: 0 / 0
Сохранить данные от FirebaseMessagingService в то время бездействия приложения
    #40127215
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
у меня в Activity в качестве DI-контейнера используется Kodein. Попытки внедрить зависимости в сервис были неудачными (например viewmodel), потому что они имеют разный контекст.
В этой ситуации необходимо будет постоянно держать один инстанс RoomDataBase в Activity с LiveData, чтобы показывать данные из RecyclerView, а другой нужно будет держать в сервисе. Но в мануалах по Room написано, что не рекомендуется создать более одного инстанса.
...
Рейтинг: 0 / 0
Сохранить данные от FirebaseMessagingService в то время бездействия приложения
    #40127318
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Попытки внедрить зависимости в сервис были неудачными (например viewmodel)
и правильно, viewmodel место рядом с view. внедрять нужно только dao


vb_sub
потому что они имеют разный контекст.

для RoomDatabase нужен ApplicationContext, неужели он разный для сервиса и Activity?

vb_sub
Но в мануалах по Room написано, что не рекомендуется создать более одного инстанса
там написано, что не рекомендуется в виду его тяжести, но не значит, что это будет работать как-то неправильно или не будет работать в принципе. Я однако сомневаюсь, что FirebaseService и основное приложение работают в разных процессах, FirebaseService работает в другом потоке, но процесс тот же.
...
Рейтинг: 0 / 0
Сохранить данные от FirebaseMessagingService в то время бездействия приложения
    #40127689
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
chpashaдля RoomDatabase нужен ApplicationContext, неужели он разный для сервиса и Activity
конкретно для FirebaseMessagingService контекст разный. Более того, служба работает, даже когда Application не запущено или закрыто окончательно.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Сохранить данные от FirebaseMessagingService в то время бездействия приложения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (10): Анонимы (6), Bing Bot, Yandex Bot, RePredeclared 5 мин., CerebroSQL 9 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]