PendingIntent 不发送 Intent 额外内容
Posted
技术标签:
【中文标题】PendingIntent 不发送 Intent 额外内容【英文标题】:PendingIntent does not send Intent extras 【发布时间】:2013-08-04 23:16:02 【问题描述】:我的MainActicity
以Intent
开头,Intent
有一个额外的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
extra 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
当我直接使用带有“sNextValue”的Intent
启动MainActivity
时,如下所示:
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
一切正常,当isNextWeek
为true
时,我得到true
。
总是有一个false
值,我做错了什么?
更新
这解决了问题: https://***.com/a/18049676/2180161
引用:
我的怀疑是,因为 Intent 中唯一改变的是 额外的,
PendingIntent.getActivity(...)
工厂方法是 只需重新使用旧意图作为优化。在 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
查看answer below 为什么最好使用PendingIntent.FLAG_UPDATE_CURRENT
。
【问题讨论】:
PendingIntent.FLAG_CANCEL_CURRENT 为我工作,谢谢 为我节省了很多时间。正确答案! 您有问题和解决方案:D 很好。我认为您应该将其添加为问题的答案。 +10 秒优于 +5 秒 ;) 引用此解决方案:***.com/questions/1198558/… FLAG_UPDATE_CURRENT 在我的情况下是不够的,因为我的小部件重用了相同的 PendingIntent。我最终将 FLAG_ONE_SHOT 用于很少发生的操作,并保持小部件 PendingIntent 完好无损。 【参考方案1】:以下代码应该可以工作:-
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 中创建:
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek"))
boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
【讨论】:
new Notification(icon, message, when);
已弃用
没有 CLEAR_TOP 怎么办?【参考方案2】:
我认为您需要在收到新邮件时更新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);
编辑:
只有在收到意图时您的 Activity 已经启动时才需要这样做。如果您的活动是由意图开始(而不仅仅是恢复),那么问题出在其他地方,我的建议可能无法解决。
【讨论】:
如果 Activity 已关闭,然后在通知中打开,也会出现此信息。【参考方案3】:使用 PendingIntent.FLAG_CANCEL_CURRENT 不是一个好的解决方案,因为内存使用效率低下。请改用 PendingIntent.FLAG_UPDATE_CURRENT。
也使用 Intent.FLAG_ACTIVITY_SINGLE_TOP(如果 Activity 已经在历史堆栈的顶部运行,则不会启动它)。
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() 不同,这将始终返回启动您的活动的第一个 Intent。
@Override
protected void onNewIntent(Intent intent)
int startPageNumber;
if (intent != null)
startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
else
startPageNumber = 0;
【讨论】:
以上是关于PendingIntent 不发送 Intent 额外内容的主要内容,如果未能解决你的问题,请参考以下文章
获取有关 PendingIntent 的 Intent 的详细信息