我写了一个简单的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);
这段代码在我的应用程序中仅被调用,它会显示一个带进度条的通知(所有这些都正确)。
现在,当用户点击此通知时,我的应用会处理onResume
事件。
public void onResume()
{
super.onResume();
// TODO: Extras è SEMPRE NULL!!! impossibile!
Intent callingintent = getIntent();
Bundle extras = callingintent.getExtras();
但附加内容总是为空!
我尝试过任何组合:
notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");
或
Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);
但是getIntent()。getExtras()总是返回NULL。
答案 0 :(得分:113)
这是情景:
方法getIntent()
返回FIRST意图而不是启动活动。
因此,当活动被CLOSED(终止)并且用户点击通知时,它将运行活动的新实例,并且getIntent()
按预期工作(Extras is not null
)。
但是如果活动“正在休眠”(它在后台)并且用户点击了通知,getIntent()
总是会返回启动活动的第一个意图,而不是通知意图。
因此,要在应用程序运行时捕获通知意图,只需使用此
即可 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
然后覆盖onNewIntent(Intent newintent)
。
因此,当应用程序首次运行时,可以使用getIntent()
,当应用程序从休眠状态恢复时,onNewIntent
可以正常运行。
答案 1 :(得分:90)
只需将此代码写在您的Resume()方法之上。这就是全部。这会刷新意图 - 我真的不知道,但它确实有用。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
答案 2 :(得分:15)
问题:您正在为待处理的强制发送相同的请求代码。改变这一点。
解决方案:设置全局变量int UNIQUE_INT_PER_CALL = 0,并在下面创建pendingIntent调用。
PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL ++; //增加。
答案 3 :(得分:3)
由于您的活动似乎已在运行,我认为您需要指定FLAG_UPDATE_CURRENT
,否则getIntent()
调用将返回上一个。请参阅this answer。
答案 4 :(得分:-8)
查看Shared Preferences是否传递和检索持久性键/值对。