使用 GCM 的 PendingIntent 发送时 Intent extras 丢失

Intent extras being lost when sending with PendingIntent for GCM

我正在创建一个 notification,但是当使用 PendingIntent 发送它时,extras 在这个过程中丢失了。我正在使用 singleTop Activity,所以我在 onNewIntent 和我的 handleIntent 处设置了一个断点,以查看当我单击通知时哪个正在启动。

当我点击通知时,它启动了我的 handleIntent 方法。我以为 singleTop activity 会触发 onNewIntent 方法?

为什么我的 Intent extras 在创建 notification 的过程中丢失了?我调试了 intent,它显示 Bundle[mParcelledData.dataSize=168]。我如何 unparcel 捆绑包?

Activity 处理意图

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);

    mPrefs = new SharedPrefs(this);
    mDb = DatabaseManager.getInstance(this);
    mVolleyManager = new VolleyManager(this);
    fm = getSupportFragmentManager();

    setupToolbar();
    setupNavDrawer();
    setupBroadcastReceivers();
    setupUniversalImageLoader();

    if (savedInstanceState == null) {
        FragmentTransaction ft = fm.beginTransaction();
        ft = ViewManager.setFragmentAnimations(ft);

        if (!mPrefs.getDemoMode()) {
            if (!mPrefs.getLoggedIn()) {
                ft.add(R.id.container, LoginFragment.newInstance(), GlobalVars
                        .TAG_LOGIN_FRAGMENT).commit();
            }
            else {
                ft.add(R.id.container, BrowseFragment.newInstance(), GlobalVars.
                        TAG_BROWSE_FRAGMENT).commit();
            }
        }
    }

    // Handles intents mainly sent from GCM notification click events
    handleIntent();
}

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    handleIntent();
}

private void handleIntent() {
    Intent intent = getIntent();

    if (intent.hasExtra(GlobalVars.KEY_EVENT)) {
        handleGcmIntent(intent);
    }
}

向意图添加额外内容并创建通知

        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra(GlobalVars.KEY_EVENT, events);
        intent.putExtra(GlobalVars.KEY_GAME_DATE_ID, gameDate.getId());

        String text = getResources().getString(R.string.msg_found_match);
        createNotification(text, intent);

private void createNotification(String text, Intent intent) {
    mNotificationManager = (NotificationManager) this.getSystemService(Context
            .NOTIFICATION_SERVICE);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("LovelUp")
            .setContentText(text)
            .setAutoCancel(true)
            .setLights(R.color.primary_blue, 2000, 2000);

    if (mPrefs.getNotificationVibrate()) {
        mBuilder.setVibrate(new long[] {1000, 1000, 1000});
    }
    if (mPrefs.getNotificationSound()) {
        mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
    }

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(intent);

    PendingIntent contentIntent = stackBuilder.getPendingIntent(0, PendingIntent
            .FLAG_CANCEL_CURRENT);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

您可能想要使用 putStringArrayListExtra 将 ArrayList 添加到包中。

你的情况:

intent.putStringArrayListExtra(GlobalVars.KEY_EVENT, events);

然后使用getStringArrayListExtra检索数据。

更多信息 here(搜索 putStringArrayListExtra

这是因为 Intent.putExtra(String key, <Whatever> value) 不接受 ArrayList 作为值。你的代码通过了编译器,因为 ArrayList 是可序列化的,它被接受但是 ArrayList 有其他错误。

你应该使用 [putStringArrayListExtra()][1]