Почему моя активность всегда показывает один и тот же набор данных из уведомления GCM?

Я реализовал простой GCM-клиент, и у меня возникает эта проблема при обновлении Activity, который запускается каждый раз при получении нового уведомления. Каждый раз, когда я отправляю уведомление с набором параметров, в пользовательском интерфейсе отображаются только параметры, которые я отправил для первого уведомления. Когда я пытаюсь изменить параметры, они не отображаются (одни и те же данные снова отображаются).

Вот мой класс GcmIntentService

public class GcmIntentService extends IntentService { private static final String TAG = "GcmIntentService"; public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; public GcmIntentService() { super("GcmIntentService"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String messageType = gcm.getMessageType(intent); if (!extras.isEmpty()) { if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR .equals(messageType)) { Log.d(TAG, "GCM error -> MESSAGE_TYPE_SEND_ERROR"); sendNotification("Send error: " + extras.toString(), "", "", "", ""); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED .equals(messageType)) { Log.d(TAG, "GCM error -> MESSAGE_TYPE_DELETED"); sendNotification( "Deleted Messages on server: " + extras.toString(), "", "", "", ""); } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE .equals(messageType)) { Log.d(TAG, "GCM success. Received data: fromUser=" + extras.getString("fromUser") + " message=" + extras.getString("message") + " srcLat=" + extras.getString("srcLat") +" srcLng=" + extras.getString("srcLng") + " dstLat=" + extras.getString("dstLat") + " dstLng=" + extras.getString("dstLng")); sendNotification( extras.getString("fromUser") + " " + extras.getString("message"), extras.getString("srcLat"), extras.getString("srcLng"), extras.getString("dstLat"), extras.getString("dstLng")); } } GcmBroadcastReceiver.completeWakefulIntent(intent); } private void sendNotification(String msg, String srcLat, String srcLng, String dstLat, String dstLng) { mNotificationManager = (NotificationManager) this .getSystemService(Context.NOTIFICATION_SERVICE); Intent intent = new Intent(this, ShowUser.class); intent.putExtra("message", msg); intent.putExtra("srcLat", srcLat); intent.putExtra("srcLng", srcLng); intent.putExtra("dstLat", dstLat); intent.putExtra("dstLng", dstLng); Log.d(TAG, "-> sendNotification -> Received parameters:\nmessage:" + msg + "\nsrcLat=" + srcLat + "\nsrcLng=" + srcLng + "\ndstLat=" + dstLat + "\ndstLng=" + dstLng); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( this).setSmallIcon(R.drawable.ic_launcher) .setContentTitle("New Taxi Request Received") .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setContentText(msg); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } } 

И вот моя активность, которая запускается при нажатии уведомления.

 public class ShowUser extends Activity { private TextView messageTextView; private TextView showUsernameTextView; private TextView srcLatTextView; private TextView srcLngTextView; private TextView dstLatTextView; private TextView dstLngTextView; private SharedPreferences prefs; private String username; private static final String TAG = "ShowUser"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_user_details); Intent intent = getIntent(); String message = intent.getStringExtra("message"); String srcLat = intent.getStringExtra("srcLat"); String srcLng = intent.getStringExtra("srcLng"); String dstLat = intent.getStringExtra("dstLat"); String dstLng = intent.getStringExtra("dstLng"); Log.d(TAG, "ReceivedExtras: message=" + message + "srcLat=" + srcLat + "srcLng=" + srcLng + "dstLat=" + dstLat + "dstLng=" + dstLng); prefs = getSharedPreferences(DriverLoginActivity.USER_CREDENTIALS, Context.MODE_PRIVATE); username = prefs.getString(DriverLoginActivity.USERNAME, null); if(username!= null) { messageTextView = (TextView) findViewById(R.id.messageTextView); showUsernameTextView = (TextView) findViewById(R.id.showUsernameTextView); srcLatTextView = (TextView) findViewById(R.id.sourceLatTextView); srcLngTextView = (TextView) findViewById(R.id.sourceLngTextView); dstLatTextView = (TextView) findViewById(R.id.destinationLatTextView); dstLngTextView = (TextView) findViewById(R.id.destinationLngTextView); showUsernameTextView.setText("Welcome " + username); messageTextView.setText(message); srcLatTextView.setText("Source Latitude: " + srcLat); srcLngTextView.setText("Source Longitude: " + srcLng); dstLatTextView.setText("Destination Latitude: " + dstLat); dstLngTextView.setText("Destination Longitude: " + dstLng); } } } 

Я думаю, что это, вероятно, имеет какое-то отношение к PendingIntent но я не уверен, что происходит здесь, так как я относительно новичок в использовании PendingIntent и уведомлений в Android. Может ли кто-нибудь рассказать мне, что происходит?

В sendNotification вы получаете PendingIntent используя этот код:

 PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0); 

В первый раз, когда вы это сделаете, Android создаст новый PendingIntent используя Intent которое вы предоставляете в качестве третьего параметра этого вызова. В следующий раз вы это сделаете, Android не создаст новый PendingIntent , но вернет токен, который относится к первому PendingIntent .

Если вы хотите, чтобы Android заменил «дополнительные функции» на исходном PendingIntent когда вы выполняете этот код в следующий раз, вам нужно использовать PendingIntent.FLAG_UPDATE_CURRENT в качестве 4-го параметра в вызове getActivity() . Это все равно будет возвращать маркер, который ссылается на первый PendingIntent , но он также заменит все «дополнительные» в этом оригинальном PendingIntent с «дополнительными функциями», присутствующими в Intent переданном как третий параметр.

Intereting Posts