5

Ich habe eine GCM-Notification-Implementierung, die perfekt funktioniert. Aber die Probleme sind, sobald die Nachricht in der Absicht in der empfangenen Methode empfangen wurde, die angezeigte Nachricht ist immer die alte Nachricht. Das ist der 'extras.getString ("Nutzlast")' zeigt immer die alte Nachricht an. Ich kann nicht herausfinden, was das Problem ist.GCM Android Push-Benachrichtigung zeigt immer alte Nachricht. Intent wurde falsch empfangen

Die Klasse, die die GCM-Benachrichtigung sendet, ist:

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); 
      } 

}

Die Klasse, die die Benachrichtigung recieves ist:

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); 
      } 

}

Hier sind die Extras .getString ("Nutzlast"); hält das erste Mal eine Benachrichtigung immer gesendet.

Antwort

12

Wenn Ihre ausstehenden Absicht erstellen, verwenden Sie die FLAG_UPDATE_CURRENT

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

Ansonsten ist die alte Absicht ohne die neuen Extras

+0

Funktioniert. Vielen Dank. – jasdmystery

+0

Ich habe das gleiche Problem. aber "FLAG_UPDATE_CURRENT" funktioniert nicht für mich. Ich erhalte immer noch die alte Nachricht. – viji

+0

funktioniert für mich, danke – TheMan

1

Versuch wiederverwendet wird Ihre Absicht innerhalb

@Override protected void onNewIntent zu holen (Absichtserklärung) {

super.onNewIntent(intent); 

    Bundle extras = intent.getExtras(); 
    fromScreen = getIntent().getIntExtra("FROMSCREEN", 
      Config.SHARE_SCREEN_TAG); 
//enter code here 

}