这似乎是一个普遍的问题,我经历了所有相关的问题,我能找到已经来到: 活动不拿起新的意图 , 为什么额外的数据(整数)没有在Android通知意向发送? , 通知通过老意图额外 , 不能把临时演员在通知的意图 , Android的意图未决问题的通知 ; 但仍然无法想出解决办法。
问题是一样的。 我设置了一个的PendingIntent携带通知一些额外的信息,我不明白这一点在另一边。
下面是用于生成通知的代码:
Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;
Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);
而在另一边:
boolean start_test=getIntent().getBooleanExtra("start_test", false);
该包实际上是不存在(getExtras()返回null)。
我尝试了不同的标志为PendingIntent.getActivity
( FLAG_UPDATE_CURRENT
, FLAG_CANCEL_CURRENT
, FLAG_ONE_SHOT
),没有这些帮助的。
正如代码所示,我用getCurrentMillis确保的RequestID变化....
还发现,在MyActivity, onCreate
和onNewIntent
没有得到调用。 唯一onResume
是。 即使FLAG_ACTIVITY_NEW_TASK
设置...?
我缺少的东西很简单呢?
设置FLAG_ACTIVITY_NEW_TASK
的通知意向将导致以下后果:
如果你想的意图, 实际交付您需要指定:
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
它使没有差别是否launchMode
活动是singleTop
与否,你还必须指定Intent.FLAG_ACTIVITY_SINGLE_TOP
的意图。
注意:如果活动已在任务运行和活动是不是在任务活动堆栈的顶部,任务将被推上前台。 就这样。 意图将不会被发表。 做的唯一方法这一点是添加Intent.FLAG_ACTIVITY_CLEAR_TOP
其他2个标志,但是这可能不是你想要发生(取决于您的具体情况)。
见我(还)在谷歌代码开放问题在http://code.google.com/p/android/issues/detail?id=17137
我刚添加的PendingIntent.FLAG_UPDATE_CURRENT
标志,以待处理的意图,并开始为我工作(跳过意图所有标志)。
示例代码:
PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
更简单的方法:真正的问题是,意向,为同一个目标,被替换。 我已经刚刚创建了一个新的服务,“NotificationDismissalService”解决了这个。 去到该服务的唯一目的是setDeleteIntent项目。 因为它是一个独特的服务,参数不被替换。 NotificationDismissalService的主体(和这将真正是每个唯一意图类型一个这样解雇服务)是一种简单的实现发送的意图的优选服务(读/写正确的参数)“onStartCommand”的。 因为这是一个服务于之间的实际发送,没有的PendingIntent,它工作得很好。
您可以在下面的意图发送方式演员
PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ArticleDetailedActivity.class);
contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
要获得测试Activity类意向额外的价值,你需要编写如下代码:
Intent intent = getIntent();
String extra = intent.getStringExtra("extra") ;
我用这样的事情
Intent myIntent = new Intent(context, DoSomething.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
context,
0,
myIntent,
Intent.FLAG_ACTIVITY_NEW_TASK);
退房的完整的例子在这里