Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCM android Push Notification shows old message always. Intent received incorrect

I have a GCM notification implementation which works perfectly. But, the problems is once the message has been received in the intent in the received method, the message shown is always the old message. That is the the ' extras.getString("payload") ' always shows the old message. I can't seem to figure out what the problem is.

The class which sends the GCM notification is :

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class C2DMMessageReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                            String action = intent.getAction();
                            Log.w("C2DM", "Message Receiver called");
                            if ("com.google.android.c2dm.intent.RECEIVE".equals(action)) {
                                            Log.w("C2DM", "Received message");
                                            String payload = intent.getStringExtra("payload");
                                            Log.d("C2DM", "dmControl: payload = " + payload);
                                            // TODO Send this to my application server to get the real data
                                            // Lets make something visible to show that we received the message
                                            createNotification(context, payload);
                            }
            }



            public void createNotification(Context context, String payload) {
                           NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                            Notification notification = new Notification(R.drawable.icon,
                                                            "Message sent!", System.currentTimeMillis());
                            // Hide the notification after its selected
                            //notification.flags |= Notification.FLAG_AUTO_CANCEL;
                            notification.ledARGB = 0xff00ff00;
                            notification.ledOnMS = 300;
                            notification.ledOffMS = 1000;
                            notification.flags |= Notification.FLAG_SHOW_LIGHTS;


                            Intent intent = new Intent(context, MessageReceivedActivity.class);
                            intent.putExtra("payload", payload);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            intent.putExtra("NotifID", 1);
                            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,intent, 0);
                            notification.setLatestEventInfo(context, "Message","Message Recieved", pendingIntent);
                            notificationManager.notify(0, notification);
            }

}

The class which recieves the notification message is:

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.TextView;

public class MessageReceivedActivity extends Activity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                            setContentView(R.layout.activity_result);
                            NotificationManager notificationManager = (NotificationManager) this
                                                            .getSystemService(Context.NOTIFICATION_SERVICE);
                            //---cancel the notification---
                            int id=getIntent().getExtras().getInt("NotifID");
                            notificationManager.cancelAll();       
                            Bundle extras = getIntent().getExtras();
                            if (extras != null) {
                                            String message = extras.getString("payload");
                                            if (message.equals("call")) {
                                                            Intent intent = new Intent(Intent.ACTION_CALL);
                                                            intent.setData(Uri.parse("tel:9916261960"));
                                                            startActivity(intent);
                                            } else if (message.equals("camera")) {
                                                            Intent cameraIntent = new Intent(
                                                                                            MediaStore.ACTION_IMAGE_CAPTURE);
                                                            startActivity(cameraIntent);
                                            } else {
                                                            if (message != null && message.length() > 0) {
                                                                            TextView view = (TextView) findViewById(R.id.result);
                                                                            view.setText(message);
                                                            }
                                            }
                            }
                            super.onCreate(savedInstanceState);
            }

}

Here, the extras.getString("payload"); holds the first time sent notification message always.

like image 537
jasdmystery Avatar asked Nov 16 '12 07:11

jasdmystery


1 Answers

When creating your pending intent, use the FLAG_UPDATE_CURRENT

PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Otherwise the old intent is reused without the new extras

like image 113
Jakob Eriksson Avatar answered Sep 27 '22 21:09

Jakob Eriksson