Search code examples
androidparse-platformpush-notificationnotifications

Custom Push Notification coming twice using Parse.com and Android


I am working in custom push notification using parse.com android. Push is successfully integrated in my application, but the problem is I am getting two notifications at a time.

One from my custom Receiver with image and other one default notification from OS without any image and that notification is not even removing from notification bar, if I am removing it, it is coming again and again on notification tray. I will paste my code snippet and images below as well.

// My Custom Receiver Class

public class CustomPushReceiver extends ParsePushBroadcastReceiver {
    private final String TAG = CustomPushReceiver.class.getSimpleName();

    private NotificationUtils notificationUtils;

    private Intent parseIntent;

    public CustomPushReceiver() {
        super();
    }

    @Override
     public void onReceive(Context context, Intent intent) {
        super.onPushReceive(context, intent);

        if (intent == null)
            return;
            parseIntent = intent;
        try {
            String action = intent.getAction();
            JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
            if (action.equalsIgnoreCase("com.parse.push.intent.RECEIVE")) {
//                NOTIFICATION_ID++;
                String title = "DW";
                if (json.has("alert"))
                {
                    String text = json.getString("alert");
                    generateNotification(context, title, json, text,parseIntent);
                }
            }
        } catch (JSONException e) {
        }
 }

    @Override
    protected void onPushDismiss(Context context, Intent intent) {
        super.onPushDismiss(context, intent);
    }

    @Override
    protected void onPushOpen(Context context, Intent intent) {
        super.onPushOpen(context, intent);
    }

   private void generateNotification(Context context, String title, JSONObject json, String text, Intent intent) {
//        Intent intent = new Intent(context, home.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);

        NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        android.support.v4.app.NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.drawable.log_pic_small)
                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.log_pic))
                        .setAutoCancel(true)
                        .setContentTitle(title)
                        .setContentText(text)
                        .setStyle(new NotificationCompat.BigTextStyle().bigText(text))
                        .setTicker(text)
                        .setLights(Color.GREEN, 500, 500);
        mNotifM.cancel(0);
        mBuilder.setContentIntent(contentIntent);
        mNotifM.notify(110, mBuilder.build());
    }
}

Manifest file

<service android:name="com.parse.PushService" />

        <receiver
            android:name="com.restaurant.services.CustomPushReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.DELETE" />
                <action android:name="com.parse.push.intent.OPEN" />
            </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" />

                <!-- IMPORTANT: Change "info.androidhive.parsenotifications" to match your app's package name. -->
                <category android:name="com.dw" />
            </intent-filter>
        </receiver>

enter image description here


Solution

  • I think your problem is generated by the method super.onPushReceive(context, intent); in your public void onReceive(Context context, Intent intent).

    I think you should override protected void onPushReceive(Context context,Intent intent) and handle the push notification there. NOTE: DO NOT CALL super if you override onPushReceive because it will display again the push.

    As per Parse documentation:

    Called when the push notification is received. By default, a broadcast intent will be sent if an "action" is present in the data and a notification will be show if "alert" and "title" are present in the data.

    EDIT

    public class CustomPushReceiver extends ParsePushBroadcastReceiver { ..... init code here from your exaple....

    @Override
    public void onReceive(Context context, Intent intent) {
      super.onReceive(Context context, Intent intent);
    }
    @Override
    public void onPushReceive(Context context, Intent intent) {
        //NO SUPER CALL
      ....exact code from your onReceive.....
    }
    ... rest of the code from your example...
    

    }

    I think you can handle it from here.