Activity 没有得到正确的包

Activity does not get correct bundle

我正在使用 GCM,这是我的 onMessage 函数:

@Override
protected void onMessage(Context context, Intent intent) {
    if (intent != null && intent.getExtras() != null) {
        try {
            String message = intent.getExtras().getString("message");
            String userId = intent.getExtras().getString("user_id");
            Log.i("","postda user id is:" + userId);
            Log.i("","will enter here FRIENDS: ");
            generateNotification(context, message, userId);
        } catch (Exception e) {
            Utils.appendLog("onMessage errror : " + e.getMessage());
            Log.i(TAG, e.getMessage(), e);
        }
    }
}

这是我的 CreateNotification 函数:

private static void generateNotification(Context context, String message, String userID) {
    Log.i("", "postda user message " + message + ".... userid: " + userID);
    String title = context.getString(R.string.passenger_name);
    Intent notificationIntent = new Intent(context, PSProfileActivity.class);
    notificationIntent.putExtra("id", userID);
    Log.i("", "postda ---------- userid: "+ userID);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
    Log.i("", "postda message: " + message + "....userID " + userID );

    PSLocationCenter.getInstance().pref.setDataChanged(context, true);
    PSLocationCenter.getInstance().pref.setDataChangedProfile(context, true);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
    mBuilder.setContentTitle(title).setContentText(message).setSmallIcon(R.drawable.notification_icon);
    mBuilder.setContentIntent(intent);
    Notification notification = mBuilder.build();
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, notification);

    playTone(context);
}

这是 PSProfileActivity onCreate 函数:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);
    ButterKnife.inject(this);

    mHeader = new ProfileHeader(this, backFromHeader);
    mData = new ProfileData(this);
    mButtons = new ProfileViewPagerButtons(PSProfileActivity.this, firstPage);

    Bundle bundle = getIntent().getExtras();
    if(bundle != null) id = bundle.getString("id");
    Log.i("", "postda in profile id is:" + id);
    if(!id.contentEquals(String.valueOf(PSLocationCenter.getInstance().pref.getUserId(PSProfileActivity.this)))){
        findViewById(R.id.action_settings).setVisibility(View.INVISIBLE);
    }
    Log.i("", "postda in profile id is 2:" + id);
}

这是我的 Logcat 回复:

04-17 15:33:53.650   9699-11695/nl.hgrams.passenger I/﹕ postda user id is:23
04-17 15:33:53.651   9699-11695/nl.hgrams.passenger I/﹕ postda user message alin reddd accepted your friend request..... userid: 23
04-17 15:33:53.651   9699-11695/nl.hgrams.passenger I/﹕ postda ---------- userid: 23
04-17 15:33:53.652   9699-11695/nl.hgrams.passenger I/﹕ postda message: alin reddd accepted your friend request.....userID 23
04-17 15:33:58.812    9699-9699/nl.hgrams.passenger I/﹕ postda in profile id is:28
04-17 15:33:58.814    9699-9699/nl.hgrams.passenger I/﹕ postda in profile id is 2:28

如您所见,我通过捆绑包发送了一个 ID,但我在另一页上获得的是一个完全不同的 ID(它实际上是本应在此处获得的最后一个 ID)。这真的很奇怪,有人知道为什么会这样吗?

问题可能是您只使用了附加功能来修改 PendingIntent。尝试将 id 嵌入到 notificationIntent 的数据字段中。

来自http://developer.android.com/reference/android/app/PendingIntent.html

A common mistake people make is to create multiple PendingIntent objects with Intents that only vary in their "extra" contents, expecting to get a different PendingIntent each time. This does not happen. The parts of the Intent that are used for matching are the same ones defined by Intent.filterEquals. If you use two Intent objects that are equivalent as per Intent.filterEquals, then you will get the same PendingIntent for both of them.

PendingIntent中使用唯一标识符:

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);      
PendingIntent.getActivity(context, iUniqueId, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

我认为你必须使用这个标志,FLAG_UPDATE_CURRENT

像这样: PendingIntent.getActivity(上下文,0,意图,PendingIntent.FLAG_UPDATE_CURRENT);

这将使用您通过捆绑包传递的新附加功能刷新旧意图,并获得与 ID 匹配的正确数据。

您始终使用相同的 ID 生成意图。您需要将唯一标识符作为第二个参数传递,还需要添加 Flag FLAG_UPDATE_CURRENT 以便 extras 得到更新,并且您始终获得传递的最新 extras 。

所以你必须像这样生成意图:

PendingIntent intent = PendingIntent.getActivity(context, identifier , notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT );

标识符可以是任何唯一的,例如自动递增变量或当前时间戳