gpt4 book ai didi

android - PendingIntent 不发送 Intent 额外内容

转载 作者:IT老高 更新时间:2023-10-28 13:01:22 27 4
gpt4 key购买 nike

我的 MainActicityIntent 启动 RefreshService,其中有一个名为 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

当我使用 Intent 直接启动 MainActivity 和 ìsNextValue` 时,如下所示:

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

一切正常,当 isNextWeektrue 时,我得到 true

总是有一个 false 值,我做错了什么?

更新

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

引用:

My suspicion is that, since the only thing changing in the Intent is the extras, the PendingIntent.getActivity(...) factory method is simply re-using the old intent as an optimization.

In RefreshService, try:

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

See:

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

更新 2

answer below为什么最好使用 PendingIntent.FLAG_UPDATE_CURRENT

最佳答案

使用 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) 事件处理程序,这样您就可以访问为 Activity 调用的新 Intent (这不一样就像调用 getIntent() 一样,这将始终返回启动您的 Activity 的第一个 Intent。

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

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

关于android - PendingIntent 不发送 Intent 额外内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com