getIntent()附加内容始终为NULL


76

我写了一个简单的Android应用,它显示了这样的自定义通知:

Context context = getApplicationContext();          
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification( R.drawable.icon, title, System.currentTimeMillis());  
Intent notificationIntent = new Intent( context,  this.getClass()); 
notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE"); 
PendingIntent pendingIntent = PendingIntent.getActivity( context , 0, notificationIntent, 0);               
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(context.getPackageName(), R.layout.notifypbar);
notification.contentIntent = pendingIntent;

notification.contentView.setTextViewText(R.id.notifypb_status_text, text);
notification.contentView.setProgressBar(R.id.notifypb_status_progress, 100, (int)(100*progress), false);

manager.notify(104, notification);

这段代码在我的应用程序中称为ONCE ONCE,它显示带有进度条的通知(全部正确)。

现在,当用户单击此通知时,我的应用程序将处理该onResume事件。

public void onResume()
{
    super.onResume();
    // TODO: Extras è SEMPRE NULL!!! impossibile!
    Intent callingintent = getIntent(); 
    Bundle extras = callingintent.getExtras();

但是Extras始终为NULL!

我尝试了以下任何组合:

notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");

要么

Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);

但是getIntent()。getExtras()始终返回NULL。


您是否尝试在通知中设置应用程序上下文?
apesa 2011年

Answers:


117

这是这种情况:
该方法getIntent()比启动活动返回FIRST意图。

因此,当活动被关闭(终止)并且用户单击通知时,它将运行该活动的新实例getIntent()并按预期工作(Extras不是 null)。

但是,如果活动是“正在休眠”(处于后台),并且用户单击通知,则getIntent()始终返回启动活动的最初意图,而不是返回通知意图。

因此,要在应用程序运行时捕获通知意图,只需使用此方法

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

然后覆盖onNewIntent(Intent newintent)

因此,当应用程序首次运行时,getIntent()可以使用它,而当应用程序从睡眠状态恢复时,它onNewIntent可以工作。


44
以下对我有用:PendingIntentendingIntent = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
user672009 2013年

3
awsme的答案..我浪费了很多时间来调试此问题。非常感谢。
迪帕克

就我而言,在启动器活动中添加更多android:launchMode =“ singleTask”。谢谢!
阮阮

96

只需将此代码写在Resume()方法之上的上方即可。这就是全部。这刷新了意图-我不太清楚,但是可以。

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

1
该解决方案在一项活动中对我有效,未经使用测试。
coolcool1994

2
您是救生员!
Farouk Touzi 2015年

3
两天后保存我的一天:))))

19

问题:您正在为未决强度发送相同的请求代码。改变这个。

解决方案:设置全局变量int UNIQUE_INT_PER_CALL = 0并在创建如下的未决调用时进行设置。

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.

1
这对我有用。我用过int notificationId = new Random().nextInt();
乔纳斯·博格伦

好的,这解决了我的问题,您能详细说明为什么这很重要吗?就我而言,我只是发送一个意图。
jellyfication

3

由于您的活动似乎已经在运行,我认为您需要指定FLAG_UPDATE_CURRENT,否则该getIntent()调用将返回上一个。看到这个答案


但是,我的申请中没有“上一个”的意图。该段代码仅被称为ONCE,此后将不会创建或更新其他意图。
Magius

所有活动都是由意图开始的,因此必须有一个先前的意图。哈哈,我刚刚看到了您自己的答案,那是我的意思!
dmon 2011年

1
这就是为我解决的问题。这里的地方设置该标志:developer.android.com/reference/android/app/...
finiteloop

-9

查看共享首选项,以传递和检索持久键/值对。


我不需要将数据存储到首选项中。我将共享首选项用于其他目的。我需要通过ExtraData传递Intent。
Magius
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.