PendingIntent不发送Intent额外内容


127

我的MainActicity 开头RefreshServiceIntent,其中有一个boolean额外的名称isNextWeek

我的作品RefreshService会在用户点击时Notification启动MainActivity

看起来像这样:

    Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);

    Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
    pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
    notification = builder.build();
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(NOTIFICATION_REFRESH, notification);

正如你所看到的notificationIntent应该有boolean额外的IS_NEXT_WEEK与价值isNextWeek这是摆在PendingIntent

现在当我点击这个Notification我总是得到false作为价值isNextWeek

这是我在中获取值的方式MainActivity

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

日志:

08-04 00:19:32.500  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false

当我直接启动MainActivityIntent像这样的ìsNextValue`:

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

一切正常,我知道true什么时候isNextWeektrue

总是false有价值的我错了什么?

更新

这解决了问题:https : //stackoverflow.com/a/18049676/2180161

引用:

我的怀疑是,由于Intent中唯一发生变化的是Extras,因此PendingIntent.getActivity(...)工厂方法只是简单地将旧的Intent用作优化。

在RefreshService中,尝试:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

看到:

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

更新2

请参阅下面的答案,为什么更好用PendingIntent.FLAG_UPDATE_CURRENT


2
PendingIntent.FLAG_CANCEL_CURRENT为我工作,谢谢
Pelanes 2014年

1
节省了我很多时间的工作。正确答案!
TharakaNirmana 2014年

您有问题和解决方案:D很好。我认为您应该将其添加为问题的答案。+ 10s优于+ 5s;)
Muhammed Refaat 17-4-18的


在我的情况下,FLAG_UPDATE_CURRENT不足,因为相同的PendingIntent被我的小部件重新使用了。我最终使用了FLAG_ONE_SHOT来执行很少发生的操作,并保持小部件PendingIntent完好无损。
Eir

Answers:


29

由于内存使用效率低,使用PendingIntent.FLAG_CANCEL_CURRENT不是一个好的解决方案。而是使用PendingIntent.FLAG_UPDATE_CURRENT

还使用Intent.FLAG_ACTIVITY_SINGLE_TOP(如果活动已在历史记录堆栈的顶部运行,则不会启动该活动)。

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

然后:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

现在应该可以工作了。


如果您仍然没有预期的行为,请尝试实现 void onNewIntent(Intent intent)事件处理程序,以这种方式可以访问为该活动调用的新意图(与仅调用getIntent()不同),这将始终返回启动的第一个意图您的活动。

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}

21

我认为您需要Intent通过覆盖“ onNewIntent(Intent)活动” 来更新收到的新邮件。将以下内容添加到您的活动中:

@Override
public void onNewIntent(Intent newIntent) {
    this.setIntent(newIntent);

    // Now getIntent() returns the updated Intent
    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);        
}

编辑:

仅在收到意图后,您的活动已经开始时才需要这样做。如果您的活动是按意图开始的(而不仅仅是恢复),则问题出在其他地方,我的建议可能无法解决。


如果活动已关闭,然后在打开通知时也显示该消息。
maysi 2013年

3

下面的代码应该工作:

int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

在MainActivity onCreate中:

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}

new Notification(icon, message, when);已弃用
maysi

反正没有CLEAR_TOP就可以吗?
理查德(Richard)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.