5

完全に機能する GCM 通知の実装があります。ただし、問題は、メッセージが受信メソッドのインテントで受信されると、表示されるメッセージが常に古いメッセージになることです。つまり、' extras.getString("payload") ' は常に古いメッセージを表示します。問題が何であるかを理解できないようです。

GCM 通知を送信するクラスは次のとおりです。

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

}

通知メッセージを受け取るクラスは次のとおりです。

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

}

ここでは、extras.getString("payload"); 初回送信通知メッセージを常に保持します。

4

2 に答える 2

12

保留中のインテントを作成するときは、FLAG_UPDATE_CURRENTを使用します

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

それ以外の場合、古いインテントは新しいエクストラなしで再利用されます

于 2012-11-16T07:51:51.370 に答える
1

内部で意図を取得してみてください

@Override protected void onNewIntent(インテント インテント) {

super.onNewIntent(intent);

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

}

于 2013-02-26T14:41:52.040 に答える