Метод onMessageReceived не вызывается, когда приложение работает в фоновом режиме в FCM PushNotification

#android #firebase-cloud-messaging

#Android #firebase-облако-обмен сообщениями

Вопрос:

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

Я не знаю, как использовать getIntent.getExtra() , и я не смог найти правильное решение этой проблемы.

Я хочу запустить ChatActivity рассматриваемый параметр с некоторыми аргументами, когда вместо щелчка по уведомлению запускается заставка. ChatActivity Предполагается, что оно запускается, когда мое приложение находится на переднем плане.

Вот мой код:

 public class FcmMessagingService extends FirebaseMessagingService
{
    private static final String TAG = "FcmMessagingService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage)
    {

        sendNotification(remoteMessage.getData().get("title"),remoteMessage.getData().get("body"));

        Log.d(TAG, "From: "   remoteMessage.getFrom());
        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0)
        {
            Log.d(TAG, "Message data payload: "   remoteMessage.getData());
            System.out.println("Message data payload: "   remoteMessage.getData());

        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null)
        {
            Log.d(TAG, "Message Notification Body: "   remoteMessage.getNotification().getBody());
            System.out.println("Message Notification Body: "   remoteMessage.getNotification().getBody());
        }

    }
    private void sendNotification(String messageTitle,String messageBody) {

        Intent intent = new Intent(this, ChatActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0 /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT| PendingIntent.FLAG_ONE_SHOT);

        long[] pattern = {500,500,500,500,500};

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.app_icon)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setVibrate(pattern)
                .setLights(Color.BLUE,1,1)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());


}
  

AndroidManifest:-

   <application
        android:allowBackup="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/MyMaterialTheme">
        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Home.InboxActivity"
            android:screenOrientation="portrait"
            >
        </activity>
        <activity
            android:name=".Home.HomeActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden"
            >
        </activity>
        <activity
            android:name=".Home.HistoryActivity"
            android:screenOrientation="portrait"
            >
        </activity>
        <activity
            android:name=".Home.DetailMail"
            android:screenOrientation="portrait"
            >
        </activity>
        <activity
            android:name=".Home.ChatActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

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

        <service
            android:name=".PushNotification.FcmInstanceIdService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>



    </application>
  

Мой ответ на данные

data payload: {tag=, body=sdf, badge=90, image=xyz.png, sound=default, title=XYZ}

Журналы

 10-19 18:01:49.455 25107-25174/? W/Babel: bcp TOOK TOO LONG! (15025ms > 10000ms)
10-19 18:01:49.561 25107-25187/? W/Babel: bcp TOOK TOO LONG! (15032ms > 10000ms)

                                          --------- beginning of system
10-19 18:01:49.663 750-1957/? W/Telecom: TelecomServiceImpl: null is not visible for the calling user
10-19 18:01:49.670 750-1623/? W/Telecom: TelecomServiceImpl: ComponentInfo{com.google.android.talk/com.google.android.apps.hangouts.telephony.TeleConnectionService}, [e44cca915afc0390d8a77c0ff4608152603e7fa3], UserHandle{0} is not visible for the calling user
10-19 18:01:49.673 25107-25107/? I/Babel_telephony: TeleModule.updateConnectionManagerRegistration, registration preference changed from false to false
10-19 18:01:49.674 25107-25107/? W/Babel: BAM#gBA: invalid account id: -1
10-19 18:01:49.674 25107-25107/? W/Babel: BAM#gBA: invalid account id: -1
10-19 18:01:49.674 25107-25107/? I/Babel_telephony: TeleModule.updateIncomingCallRegistration, preferred account for incoming calls changed from: null to null
10-19 18:01:49.676 750-1965/? W/Telecom: TelecomServiceImpl: null is not visible for the calling user
10-19 18:01:49.678 750-1689/? W/Telecom: TelecomServiceImpl: ComponentInfo{com.google.android.talk/com.google.android.apps.hangouts.telephony.TeleConnectionService}, [e44cca915afc0390d8a77c0ff4608152603e7fa3], UserHandle{0} is not visible for the calling user
10-19 18:01:49.851 25107-25199/? W/Babel: bcp TOOK TOO LONG! (15036ms > 10000ms)
10-19 18:01:49.957 1217-25451/? E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
10-19 18:01:49.996 313-25453/? D/ExtendedUtils: Try creating ExtendedExtractor
10-19 18:01:49.999 313-25453/? D/ExtendedUtils: Discarding default extractor and using the extended one
10-19 18:01:50.004 313-25453/? I/FFmpegExtractor: android-source:0xaab8c268
10-19 18:01:50.013 313-25453/? I/FFMPEG: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'android-source:0xaab8c268':
10-19 18:01:50.013 313-25453/? I/FFMPEG:   Metadata:
10-19 18:01:50.013 313-25453/? I/FFMPEG:     major_brand     : M4A 
10-19 18:01:50.013 313-25453/? I/FFMPEG:     minor_version   : 0
10-19 18:01:50.013 313-25453/? I/FFMPEG:     compatible_brands: M4A mp42isom
10-19 18:01:50.013 313-25453/? I/FFMPEG:     creation_time   : 2009-08-12 22:37:16
10-19 18:01:50.013 313-25453/? I/FFMPEG:     title           : Facebook Pop
10-19 18:01:50.013 313-25453/? I/FFMPEG:     artist          : Facebook
10-19 18:01:50.013 313-25453/? I/FFMPEG:     compilation     : 0
10-19 18:01:50.013 313-25453/? I/FFMPEG:     gapless_playback: 0
10-19 18:01:50.013 313-25453/? I/FFMPEG:     encoder         : iTunes 8.2.1, QuickTime 7.6.2
10-19 18:01:50.013 313-25453/? I/FFMPEG:     iTunSMPB        :  00000000 00000840 000000E1 00000000000016DF 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
10-19 18:01:50.013 313-25453/? I/FFMPEG:     Encoding Params : vers
10-19 18:01:50.013 313-25453/? I/FFMPEG:     iTunNORM        :  000001AE 00000000 000001AE 00000000 00000000 00000000 00007F16 00000000 00000000 00000000
10-19 18:01:50.013 313-25453/? I/FFMPEG:   Duration: 00:00:00.19, start: 0.000000, bitrate: 191 kb/s
10-19 18:01:50.014 313-25453/? I/FFMPEG:     Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 24 kb/s (default)
10-19 18:01:50.014 313-25453/? I/FFMPEG:     Metadata:
10-19 18:01:50.014 313-25453/? I/FFMPEG:       creation_time   : 2009-08-12 22:37:16
10-19 18:01:50.014 313-25453/? D/FFmpegExtractor: FFmpegExtrator, url: android-source:0xaab8c268, format_name: mov,mp4,m4a,3gp,3g2,mj2, format_long_name: QuickTime / MOV
10-19 18:01:50.014 313-25453/? I/FFmpegExtractor: adjust mime(video/mp4 -> audio/mp4a-latm)
10-19 18:01:50.014 313-25453/? D/FFmpegExtractor: suppoted codec(aac) by official Stagefright
10-19 18:01:50.014 313-25453/? D/FFmpegExtractor: ffmpeg detected media content as 'audio/mp4a-latm' with confidence 0.08
10-19 18:01:50.014 313-25453/? D/ExtendedUtils: Try creating ExtendedExtractor
10-19 18:01:50.023 313-25453/? D/ExtendedUtils: Discarding default extractor and using the extended one
10-19 18:01:50.024 1217-25451/? E/MediaPlayer: Should have subtitle controller already set
10-19 18:01:50.027 750-1623/? I/MediaFocusControl:  AudioFocus  requestAudioFocus() from android.media.AudioManager@22fd031a req=3flags=0x0
10-19 18:01:50.029 313-16421/? D/NuPlayerDriver: start(0xaab5fe68)
10-19 18:01:50.029 313-25452/? I/GenericSource: start
  

Пожалуйста, можете ли вы помочь мне с решением этой проблемы?

Комментарии:

1. отправьте фон вашего приложения и отправьте новое уведомление и предоставьте этот журнал

2. @GaneshPokale: — Я не получаю ваши требования?

3. ваш метод onMessageReceived не вызывается, когда приложение работает в фоновом режиме, верно?

4. затем отправьте приложение в фоновом режиме, а затем отправьте одно уведомление с сервера… и в этот раз вы получаете несколько журналов… обновите этот журнал здесь

5. @GaneshPokale я обновил..

Ответ №1:

У меня была такая же проблема, вот в чем фокус. Сохраните сообщение, в моем случае я использовал sharedpref, вы можете использовать Const для хранения сообщения или передать его через Etra по намерению. Удачного кодирования :>)

 public class SplashScreen extends Acivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    //When Notification is tapped
    if (getIntent().getExtras() != null) {
        //init message
        String message = String.valueOf(getIntent().getExtras().get("message"));
        String title = String.valueOf(getIntent().getExtras().get("title"));
        //save the message
        MySharedPreference.save(getApplicationContext() , "message" , message);
        MySharedPreference.save(getApplicationContext() , "title" , title);

        startActivity(new Intent(getApplicationContext() , ChatActivity.class));
        finish();
    }
  

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

Firebase.Консоль смотрите здесь

 public final class MySharedPreference {

public static void save(Context context ,String key , String value){
    SharedPreferences prefs= context.getSharedPreferences(YOUR_PACKAGE_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor= prefs.edit();
    editor.putString(key,value);
    editor.apply();

}

public static String getValue(Context context ,String key){
    //if 1st time , register the user
    SharedPreferences prefs = context.getSharedPreferences(YOUR_PACKAGE_NAME, Context.MODE_PRIVATE);
    return prefs.getString(key , "");
}
  

}

Ответ №2:

Я получил ответ.. когда вы получаете ответ json от FCM в полезной нагрузке данных, system.out.println(getIntent.getExtra()) вы получаете значение из системного трея, и мы можем управлять нашей деятельностью с помощью этого.

вот код запуска

  bundle = getIntent().getExtras();
                if(bundle!=null) {
        for (String key : bundle.keySet()) {
            Object value = bundle.get(key);
            Log.d("DATA_SENT", String.format("%s %s (%s)", key, value.toString(), value.getClass().getName()));
            System.out.println("messa vale"   String.format("%s %s (%s)", key, value.toString(), value.getClass().getName()));

            if (key.equals("changeit_id")) {
                valu = value.toString();
                System.out.println("messa Value found:"   value);
            }
        }
    }
        if(!valu.equalsIgnoreCase(""))
        {
            Intent intent = new Intent(this, ChatActivity.class);
            intent.putExtra("item_id", valu);
            startActivity(intent);
            finish();
        }
        else
        {
            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    Intent i = new Intent(SplashActivity.this, HomeActivity.class);
                    finish();
                    startActivity(i);
                }
            }, 3000);
        }
  

Ответ №3:

В соответствии с обработкой сообщений Firebase существует два типа сообщений: данные и уведомления. Если ваше приложение работает в фоновом режиме и вы отправляете уведомление, onMessageReceived оно не будет вызвано. Это два исключения, когда onMessageReceived не вызывается:

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

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

Если remoteMessage.getData() и remoteMessage. getNotification() оба значения не равны нулю, а приложение находится в фоновом режиме, то часть данных принимается в дополнение к вашей активности запуска. Оттуда вам нужно будет явно вызвать свою активность в чате.

введите описание изображения здесь

Комментарии:

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

2. Каково все ваше сообщение json? Включает ли он какую-либо часть уведомления? Я имею в виду, является ли remoteMessage.getNotification() нулевым или нет?

3. remoteMessage.getNotification() не равен нулю, я получаю тот же ответ, что и данные. но мой метод onmessagerecive не вызывается, когда я получаю уведомление и нажимаю на него. (приложение в фоновом режиме), вместо переднего плана я могу перейти в чат.

4. Если remoteMessage.getData() и remoteMessage. getNotification() оба значения не равны нулю, и если приложение находится в фоновом режиме, то уведомление не будет получено в onMessageReceived . Проверьте getIntent.getExtra() внутри onCreate вашей активности запуска, которая получает полезную нагрузку данных.

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

Ответ №4:

добавьте click_action в admin.php

 $fields = array(

        'to'                        => $reg_id ,
        'priority'                  => "high",
        'notification'              => array( "title" => "Android Learning", "body" => $message, "tag" => $tag, "click_action" => "OPEN_ACTIVITY_1" ),
        'data'                      => array("message" =>$message, "image"=> $img_url),
    );
  

и установите click_action в OPEN_ACTIVITY_1, чтобы запустить фильтр намерений, подобный следующему:

 <activity android:name=".HomeActivity">
    <intent-filter>
        <action android:name="OPEN_ACTIVITY_1" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>