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>
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.