Дополнительное push-уведомление, отправленное на устройство Android

Я реализовал уведомления обозревателя Parse, но для меня есть проблема на стороне Android. Всякий раз, когда я отправляю уведомление от Parse, все устройства Android получают два уведомления: одно с текстом, который я отправил, а другой с пустым текстом.

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

Примечание. В мой проект также добавлены собственные уведомления для Android (уведомления GCM). Возможно ли, что они вызывают эту проблему?

Спасибо.

AndroidManifest настроен следующим образом:         

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />


<application
    android:name=".activityApplication"
    android:label="@string/app_name"
    android:icon="@drawable/icon">

    <activity android:name=".activity"
              android:label="@string/app_name"
              android:screenOrientation="landscape"
              android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
              android:configChanges="orientation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.google.android.gms.ads.AdActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>


    <!-- gcm -->
    <receiver
        android:name="com.company.activity.GCBroadcastReceiver"
        android:exported="true"
        android:process=":remote"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <category android:name="com.company.activity" />
        </intent-filter>
    </receiver>

    <service android:name=".GcmIntentService" />
    <service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParseBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.company.activity" />
        </intent-filter>
    </receiver>


</application>

И это мой приемник вещания:

public class GCBroadcastReceiver extends BroadcastReceiver
{
    private static final String TAG = "GCBroadcastReceiver";
    Context ctx;

    @Override
    public void onReceive(Context context, Intent intent)
    {
        ctx = context;

        // Local notification.
            Bundle bundle = intent.getExtras();
        String message = bundle.getString("message");
                String notificationID = bundle.getString("notificationID");

        Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID);

        sendNotification(message, notificationID); 
     }

    // Put the GCM message into a notification and post it.
    private void sendNotification(final String message, final String notificationID)
    {

        Intent notificationIntent = new Intent(ctx, Activity.class);
        PendingIntent intent = PendingIntent.getActivity(ctx, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);

        mBuilder.setContentIntent(intent);
        mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message));
        mBuilder.setWhen(System.currentTimeMillis());
        mBuilder.setSmallIcon(R.drawable.icon);
        mBuilder.setContentTitle(ctx.getString(R.string.app_name));
        mBuilder.setContentText(message);
        mBuilder.setLights(Color.RED, 400, 400);
        mBuilder.setAutoCancel(true);
        //mBuilder.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + ctx.getPackageName() + "/raw/" + sound));
        mBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);

        NotificationManager mNotificationManager = (NotificationManager) ctx
            .getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());
    }
}

Ответ 1

Parse использует GCM, поэтому, если вы отправляете уведомление в приложение, использующее Parse, и, кроме того, вы обрабатываете сообщение GCM с собственным кодом Android, который отображает уведомление, уведомление может обрабатываться дважды (один раз по вашему коду и один раз Parse), что приведет к его отображению дважды.

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

UPDATE:

Теперь, когда я вижу код, я могу добавить следующее:

У вас есть два широковещательных приемника, которые обрабатывают входящие сообщения GCM - com.parse.GcmBroadcastReceiver и com.company.activity.GCBroadcastReceiver. Оба они пытаются обработать уведомления, отправленные на ваше устройство из Parse (из вашего комментария ниже, я понимаю, что проблема не возникает при отправке ваших "локальных" уведомлений).

Я предполагаю, что библиотека Parse регистрируется самостоятельно для GCM. Если вы используете другой идентификатор отправителя (ID проекта API) для регистрации синтаксического анализа и для вашей собственной регистрации GCM, вы можете исправить свою проблему, проверив intent.getExtras ().get("from") в вашем методе onReceive. Если он не содержит идентификатор отправителя ваших локальных уведомлений, не вызывайте sendNotification(message, notificationID);, а второе уведомление с пустым текстом не будет отображаться.

public void onReceive(Context context, Intent intent)
{
    ctx = context;

    // Local notification.
        Bundle bundle = intent.getExtras();
    String message = bundle.getString("message");
            String notificationID = bundle.getString("notificationID");

    Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID);

    if (intent.getExtras ().get("from").equals (YOUR_SENDER_ID_FOR_LOCAL_NOTIFICATIONS))
        sendNotification(message, notificationID); 
 }

Теперь, если вы используете один и тот же идентификатор отправителя для обоих типов уведомлений, вы можете либо начать использовать разные идентификаторы отправителя, либо использовать другое условие - проверьте, имеет ли значение intent.getExtras ().get("message") значение. В ваших локальных уведомлениях указан этот параметр, и я предполагаю, что оповещений о них нет (что объясняет уведомления без текста, который вы видите).

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