Pull to refresh
6
0
Pavel Dolbik @pavel_dolbik

Пользователь

Send message
Большое спасибо! Очень полезно было для меня!
Пробовал писать пару совсем простых примеров, если кому интересно — git
Еще нужно упомянуть про различия в работе FCM когда приложение работает в foreground и background.

Когда вы используете FCM вам нужен сервис, который будет отвечать за прием сообщений (callback — https://developers.google.com/cloud-messaging/android/android-migrate-fcm#update_your_instanceidlistenerservice)


public class MyFcmListenerService extends FirebaseMessagingService {
  @Override
  public void onMessageReceived(RemoteMessage message){
    String from = message.getFrom();
    Map data = message.getData();
  }
  ...
}



И как только отработает этот метод, мы можете сформировать нотификацию.
NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!");



Когда ваше приложение запущено(работает) и для отправки уведомлений вы используете — <a href=«https://console.firebase.google.com/?pli=1»
Все работает прекрасно: метод onMessageReceived отрабатывает и вы видете свое кастомизированные уведомление.

Но стоит вам свернуть приложение и проделать все тоже самое — никакой вибрации, никакого звука уведомлений вы не увидете. Мало того, если будет использован android 5 и выше увидете белый квадрат, в статус баре, т.к. андройд возьмет иконку вашего приложения и зальет ее белым цветом.
В такой ситуации метод onMessageReceived не отрабатывает =(

Решение оказалось простым — <a href=«https://firebase.google.com/docs/cloud-messaging/downstream#sending_topic_messages_from_the_server
Для тестирования можно воспользоваться fiddler2

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}


Где — Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA, можно взять из google-service.json
»to": «bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...» — это токен вашего устройства, который получается из метода — onTokenRefresh() из сервиса FirebaseInstanceIdService — https://developers.google.com/cloud-messaging/android/android-migrate-fcm#update_your_instanceidlistenerservice
День добрый.
Очень интересное поведение наблюдал на Android 6.

Есть TestActivity и Presenter. В приложении есть permission, например на использование камеры.
TestActivity запущена, метод onFirstViewAttach() — отработал.
Затем, пользователь заходит в Settings и включает/выключает permission.
Возращается в TestActivity и метод onFirstViewAttach опять отрабатывает.

Когда включаешь/отключаешь permission getMvpDelegate().onDestroy(); не отрабатывает.

Почему onFirstViewAttach() отрабатывает?
@GenerateViewState — сейчас deprecated
Еще небольшой вопрос:

При загрузке данных — показываем диалоговое окно с прогрессом ( progress)
Что-то пошло не так, скрываем progress и показываем сообщение об ошибке ( error )
Пользователь прочитал сообщение об ошибке и закрыл error.

Так как это все делается через presenter, все сохраняется во view state
И при перевороте экрана отработают все 4 метода:

  1. Показать progress
  2. Скрыть progress
  3. Показать error
  4. Скрыть error

Отработает целых 4 метода ( при перевороте ), но по сути они отработают впустую, т.к. пользователь в такой ситуации не должен ничего увидеть.

Вопрос:
Можно и нужно ли как-то очищать очередь во view state?
Если будет вызвано гораздо больше методов, не приведет ли это к ненужной трате ресурсов?
Спасибо за советы!
Подскажите пожалуйста.
Если использовать Presenter для Fragment и во Fragment установить setRetainInstance(true); то при переворроте экрана, Presenter не востанавливает состояние View.

Если же убрать setRetainInstance(true); то при перевороте, происходит утечка памяти GC не освобождает память
Как правильно поступить в такой ситуации:

Есть ViewPager в котором находятся 2 фрагмента (Fragment 1, Fragment 2). UI и логика фрагментов идентичны, отличие только в выборке данных из БД.

Вопрос: Можно как-то при переходе с одного фрагмента на другой обнулять/сбрасывать ViewState. Т.е. если на Fragment 1 было показано диалоговое окно и которое должно быть показано при перевороте устройства, то при переходе на другой фрагмент, Fragment 2 должен быть в первоночальном состоянии.

В такой ситуации нужно делать один presenter и при переходе между фрагментами обрабатывать события. Или лучше сделать 2 разных presenters, но тогда получим дублирование кода.
Подскажите, пожалуйста, как правильно передать данные из View в Presenter.

Предположим:

  • есть ActivityTest
  • из Intent-а получаем значение
  • в Presenter

    protected void onFirstViewAttach() {
        super.onFirstViewAttach();
        getViewState().start();
    }

  • во View
    @Override
    public void start() {
        presenter.start(getIntent().getExtras().getInt(Constants.VALUE));
    }

Если так сделать, то при каждом перевароте экрана, будет каждый раз отрабатывать presenter.start(value), а нужно, только один раз.

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity