我正在使用以下代码从服务创建通知:
NotificationManager notificationManager = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);
CharSequence tickerText = "bla ...";
long when = System.currentTimeMillis();
Notification notification = new Notification(R.drawable.icon,
tickerText, when);
Intent notificationIntent = new Intent(ctx, SearchActivity.class).
putExtra(SearchActivity.INTENT_SOURCE,
MyNotificationService.class.getSimpleName());
PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
notificationIntent, 0);
notification.setLatestEventInfo(ctx, ctx.getString(R.string.app_name),
tickerText, contentIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(1, notification);
日志清楚地说明方法startActivity被调用两次:
04-02 23:48:06.923: INFO/ActivityManager(2466): Starting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,520][480,616] (has extras) }
04-02 23:48:06.923: WARN/ActivityManager(2466): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,520][480,616] (has extras) }
04-02 23:48:06.958: INFO/ActivityManager(2466): Starting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,0][480,96] (has extras) }
04-02 23:48:06.958: WARN/ActivityManager(2466): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,0][480,96] (has extras) }
04-02 23:48:07.087: INFO/notification(5028): onStartCmd: received start id 2: Intent { cmp=com.xy/.NotificationService }
04-02 23:48:07.310: INFO/notification(5028): onStartCmd: received start id 3: Intent { cmp=com.xy/.NotificationService }
04-02 23:48:07.392: INFO/ActivityManager(2466): Displayed activity com.xy/.SearchActivity: 462 ms (total 462 ms)
04-02 23:48:07.392: INFO/ActivityManager(2466): Displayed activity com.xy/.SearchActivity: 318 ms (total 318 ms)
他们为什么要开始两次?
stackoverflow上有两个相同的问题:here和here。 但他们没有解释最初的问题是什么,他们不适合我。例如。更改为launchMode singleTop并不适用于我,它应该可以在不更改launchMode的情况下根据official docs工作(请参阅调用搜索对话框)。
尽管如此,我还尝试将以下标志添加到notificationIntent
Intent.FLAG_ACTIVITY_CLEAR_TOP | PendingIntent.FLAG_UPDATE_CURRENT
但问题仍然存在。
答案 0 :(得分:14)
同样在这里,三星Galaxy S出现问题。解决方法有什么好主意吗?
我现在正在检查是否已收到类似的意图,如果是,则完成活动。它有效,但看起来不太好。
我们可以以某种方式取消第二个意图吗?
更新:我可以通过设置FLAG_ONE_SHOT来阻止此问题:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
答案 1 :(得分:5)
请使用以下标志。
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
|Intent.FLAG_ACTIVITY_SINGLE_TOP);
答案 2 :(得分:1)
在释放按键或按下按键时调用它(避免一般操作)!
if(event.getAction() == event.ACTION_UP){
Intent intent = new Intent(......);
startActivityForResult(intent, 0);
}
答案 3 :(得分:0)
这似乎是一个三星星系虫。确认在其他设备上一切正常。
(另见no discussion at google groups)
一种解决方法是使用笨拙但有效的技巧取消第二个意图(不确定这是否会对其他设备产生副作用):
// put a hint into the notification and check if the intent
// comes from notification or not:
String intentSource = queryIntent.getStringExtra(INTENT_SOURCE);
if (NotificationService.class.getSimpleName().equals(intentSource)) {
// don't do this again e.g. when rotating!
queryIntent.removeExtra(INTENT_SOURCE);
if (getIntent() != null && getIntent().getSourceBounds() != null) {
if (getIntent().getSourceBounds().top == 0
&& getIntent().getSourceBounds().left == 0) {
Log.w("search", "Problematic double trigger!");
}
}
}
因此请谨慎使用,并检查前一次点击是否在最后一秒完成,然后很可能是双触发问题。