Как отправить push-уведомление на Android, когда приложение закрыто

У меня есть небольшое приложение, в котором я получаю сообщение от Обмен сообщениями Firabase Cloud нормально, пока приложение работает, а пока находится в фоновом режиме. Я много ищу по этому поводу, и я не смог найти правильный ответ о том, как получать / создавать уведомления в Android, когда приложение закрыто, поэтому, пожалуйста, не думайте, что это повторяющийся вопрос. Может ли кто-нибудь показать мне пример об этом и о том, как это делается?

Это мой класс службы обмена сообщениями Firebase.

    public class MyFirebaseMessagingService extends FirebaseMessagingService {

    public static final String tag = "TAG";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d(tag,"FROM"+remoteMessage.getFrom());

        //check if message contains data
        if (remoteMessage.getData().size()>0){
            Log.d(tag,"Message Data" + remoteMessage.getData());
        }

        //check if message constains notification
        if (remoteMessage.getNotification() != null){
            sendNotification(remoteMessage.getNotification().getBody());
        }
    }

    private void sendNotification(String body){

        Intent i = new Intent(this,MainActivity.class);

        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase CLoud Messaging")
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);


        NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(0,notificationBuilder.build());
    }


}

Это мой манифест

<application
        android:allowBackup = "true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/AppTheme">
        <activity android:name = ".MainActivity">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />

                <category android:name = "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <service android:name = ".MyFirebaseMessagingService">
            <intent-filter>
                <action android:name = "com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

    </application>

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

KgaboL 17.08.2018 14:45

Было бы полезно, если бы вы предоставили пример своего json-файла, который вы отправляете через FCM.

Petr Kubáč 17.08.2018 16:27

Секундочку !!

José Nobre 17.08.2018 16:28

Я не думаю, что вижу JSON в FCM

José Nobre 17.08.2018 16:29

Вы отправляете сообщение вручную в консоли? Вы уверены, что сообщение содержит полезные данные? Если полезные данные отсутствуют, MyFirebaseMessagingService не запускается. Думаю, в консоли вам нужно будет заполнить раздел «Дополнительные параметры».

Petr Kubáč 17.08.2018 16:42

Да, я передаю параметры. И да, я отправляю сообщение в консоли

José Nobre 17.08.2018 16:51
0
6
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

  1. Уведомительное сообщение
  2. Сообщение с данными

Консоль firebase может отправлять сообщения только первого типа. И сообщение с уведомлением будет обрабатываться системой, если ваше приложение находится в фоновом режиме, но оно не будет работать, если ваше приложение остановлено.

Переключитесь на свой собственный API и отправьте сообщения с данными.

Итак, какие изменения мне нужно внести в свой код?

José Nobre 17.08.2018 14:50

Я редактирую свой ответ, чтобы лучше разобраться в проблеме.

Mauker 17.08.2018 14:53

Хорошо, но в этом случае моей серверной стороной является облачная служба Firebase, и я не вижу возможности изменить тип сообщения там, я думаю

José Nobre 17.08.2018 14:55

Вы имеете в виду консоль firebase?

Mauker 17.08.2018 14:56

и я думаю, что уже использую remoteMessage.getNotification (). getBody ())

José Nobre 17.08.2018 14:57

Моя беда, я увидел первую строчку с getData() и мой мозг обошел все остальное :)

Mauker 17.08.2018 14:58

Итак, в этом случае вы знаете, в чем проблема? :)

José Nobre 17.08.2018 14:59

Позвольте нам продолжить обсуждение в чате.

Mauker 17.08.2018 15:00

Итак, после нескольких часов работы с этой проблемой и с помощью @Mauker я, наконец, сделал это. Это шаги, которые я предпринял, и вся информация, которую я получил из Интернета.

Прежде всего забудьте Firebase Cloud Message, чтобы отправлять уведомления в мобильное приложение. Во-вторых, используйте почтальона для выполнения этих действий.

Уведомления бывают двух типов: групповые уведомления, когда все люди получают уведомление одновременно, и прямые уведомления, когда само уведомление предназначено только для просмотра пользователем.

1º Если вам нужны групповые уведомления, вы должны сделать это в своем классе средства запуска приложений:

 FirebaseMessaging.getInstance().subscribeToTopic("groupNameChoosenByYou");

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

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Map<String, String> data = remoteMessage.getData();
        String myCustomKey = data.get("title"); //received from postman POST as you can see above
        Intent i = new Intent(this,MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(myCustomKey)
                .setContentText(myCustomKey+myCustomKey)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);
        NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(0,notificationBuilder.build());
    }
}

3º Сходите к почтальону и проделайте это в своем теле.

Это должен быть ваш URL:https://fcm.googleapis.com/fcm/send

{
               "to":"/topics/groupNameChoosenByYou", 
               "data":
               {
                  "title":"Your title",
                  "message":"Your message"
               }
            }

4º В почтальоне и сделайте это в заголовках

 Authorization -> Project settings in Firebase -> Cloud Messaging and take the Server key
 Content-type -> application/json

5º Если вы хотите сделать прямое уведомление для определенного пользователя в "to":"/topics/groupNameChoosenByYou", замените идентификатором токена устройства, который создается при первом подключении к firebase (когда приложение установлено)

6º Если вы хотите отправлять уведомления, когда заявка закрыта некоторые ПЗУ не позволяют этого, кроме facebook, whatsapp (золотые приложения) и т. д., Вы должны перейти к оптимизации заряда батареи и поместить свое приложение в защищенное приложение (это меняется от бренда к бренду). Идеальный подход - дать пользователю начальное всплывающее окно, которое поможет ему в этом.

Это то, чему я научился, и это работает для меня. Любой вопрос, размещенный выше, я постараюсь больше узнать об этом и обновлять, пока я получу дополнительную информацию.

Другие вопросы по теме