Android, Firebase сервис push уведомлений

560
24 декабря 2016, 15:49

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

Сейчас это реализовано так

<activity
        android:name=".StereoIntroActivity"
        android:label="">
 <intent-filter>
            <action android:name="OPEN_ACTIVITY_1" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</activity>
<service android:name=".firebace.MessagingService">
   <intent-filter>
      <action android:name="com.google.firebase.MESSAGING_EVENT"/>
   </intent-filter>
</service>

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

public class MessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    sendNotification(remoteMessage.getNotification().getBody());
}
private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, StereoIntroActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(StereoActivity.class);
    // Adds the Intent that starts the Activity to the top of the stack
    stackBuilder.addNextIntent(intent);
    PendingIntent contentIntent = stackBuilder
            .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT
                    | PendingIntent.FLAG_ONE_SHOT);
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher))
            .setContentTitle("asasasasas!!!!") //this.getString(R.string.app_name)
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0, notificationBuilder.build());
}
}

Мне нужно чтобы открывалось StereoIntroActivity, но почему-то открывается главное активити, мне вообще кажется что этот сервис просто не работает. Подскажите, пожалуйста, в чём у меня проблема. Заранее большое спасибо!

update. вот так отправляю сообщение

Answer 1

Есть 2 разных способа отправить сообщение с помощью FireBase. Первый способ - отправить информацию в теле пуша в поле notification - так инфа будет обработана FireBase-ом мочла, без вызова метода onReceive. JSON должен выглядеть так:

{ "notification": {
    "title": "news",
    "text": "newsTExt",
     "click_action": "test"
  },
    "data": {
    "keyname": "any value"
    },
  "to" : "dAQilNw:APA91IFdt5CHCoNmombd5bqTh7WVSlAOyS-WraSrGv_IRZM"
} 

Так отобразится уведомление, которое направит юзера в активити с intentFilter test, как это указано в поле click_action. Если не будет в манифесте активити с таким фильтром - запустится главная актвити.

 <intent-filter>
            <action android:name="test"/>
            <category android:name="android.intent.category.DEFAULT"/>
 </intent-filter>

Второй способ - отправлять информацию в поле data без поля notification - так точно будет вызван метод onReceive в котором вы можете уже отреагировать на пуш нужным образом, самостоятельно отобразив уведомление. В т.ч. составить PendingIntent для запуска нужной активити.

Через саму консоль FireBase отпрвлять пуши не очень, т.к. там мало что понятно и мало контроля. Лучше отправлять запрос через программу Postman - она есть в т.ч. в виде приложения для браузера Хром.

  1. Для этого надо через Postman отправить POST запрос на адрес https://fcm.googleapis.com/fcm/send
  2. При этом надо задать заголовки
Authorization = key=%тут ключ который можно взять из консоли (Настройки-настройки проекта-CLOUD MESSAGING-ключ сервера)%
ContentType = application/json
  1. Далее в теле (body) запроса, в raw формате отправлять json с данными, в виде, описанном выше
READ ALSO
Выборка по определенному значению из MySQL в Java JDBC

Выборка по определенному значению из MySQL в Java JDBC

Прошу помочь разобраться: Я сделал выборку из БД MySQLСейчас в БД таблицы Wordpress, собственно я сделал выборку постов таким вот образом:

496
YouTube download

YouTube download

Здравствуйте! Возможно, этот вопрос тут задавали, но я не нашёл (также гугл тоже отнекивается)Суть вот в чем: как достать ссылку на скачивание...

371
Текст по всей ширине

Текст по всей ширине

Для того, чтобы текст был по всей ширине, я использовал align="justify"Всё получилось, но появился один баг: в тексте создаются большие пробелы

416
Залинковать CSS и HTML файл

Залинковать CSS и HTML файл

Не получается привязать CSS к ХТМЛу

393