活动的这段代码overrides
onNewIntent()
方法。在此方法中,我通过单击通知将选择设置为ListView
项。问题是;当有两个通知时,然后点击第一个通知所需的项目突出显示,但点击第二个通知上一个项目再次突出显示。所以请帮忙。
代码:
@Override
protected void onNewIntent(Intent new_notification) {
caller = new_notification.getExtras().getString("CALLER");
if(caller.equals("GenNot")) {
int myScrollTo = new_notification.getExtras().getInt("ID");
Log.e("SEE NOW", "myScrollTo # "+myScrollTo, new Exception());
remindersList.requestFocusFromTouch();
remindersList.setSelection(myScrollTo);
}
}
通知代码:
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
public class GenerateNotification {
public static void reminderNotification(Context context, int notification_id, String document_id, String name, String date, Location location) {
Intent intent = new Intent(context, ViewReminders.class);
intent.putExtra("CALLER","GenNot");
intent.putExtra("ID", notification_id);
PendingIntent pIntent = PendingIntent.getActivity(context, notification_id, intent, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
mBuilder.setTicker("Smart Locator");
mBuilder.setSmallIcon(R.drawable.notification_icon);
mBuilder.setContentTitle(name);
DetailsContainer dc = new LocationDetails(context).getDetails(location);
mBuilder.setContentText(date + ", " + dc.area + " " + dc.locality);
mBuilder.setContentIntent(pIntent).getNotification();
mBuilder.setAutoCancel(true);
mBuilder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(alarmSound);
NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(document_id, notification_id, mBuilder.build());
}
}
答案 0 :(得分:1)
我在项目中遇到了同样的问题。收到后通过调用pendingIntent.cancel()
解决了问题。
我在PendingIntent
发布通知之前保存了Map
的链接,然后使用notification_id
private final HashMap<String, PendingIntent> mIntents = new HashMap<String, PendingIntent>();
...
// on post
mIntents.put(challenge.getId(), pendingIntent);
...
// on click
if (mIntents.containsKey(challengeId)) {
mIntents.remove(challengeId).cancel();
}
official documentation中还有一个很好的解释:
PendingIntent本身只是对由其维护的令牌的引用 系统描述用于检索它的原始数据。这个 意味着即使其拥有的应用程序被杀死了,也就是说 PendingIntent本身将继续可用于其他进程 得到了它。如果创建应用程序稍后重新检索相同的内容 一种PendingIntent(相同的操作,相同的Intent动作,数据, 它会收到一个类别和组件,以及相同的标志 PendingIntent表示相同的标记,如果它仍然有效,和 因此可以调用cancel()来删除它。
由于这种行为,了解两个Intent的时间非常重要 为了检索PendingIntent而被认为是相同的。 人们常犯的一个错误就是创建了多个PendingIntent 具有Intent的对象只有在&#34; extra&#34;内容, 期望每次获得不同的PendingIntent。事实并非如此 发生。用于匹配的Intent部分是 由Intent.filterEquals定义的相同内容。如果你使用两个Intent 根据Intent.filterEquals等效的对象,那么你会 为他们两个获得相同的PendingIntent。
有两种典型的方法可以解决这个问题。
如果您确实需要多个不同的PendingIntent对象,请执行此操作 同时(例如使用两个显示的通知 在同一时间),那么你需要确保有一些东西 将他们与不同的人联系起来是不同的 PendingIntents。这可以是所考虑的任何Intent属性 Intent.filterEquals,或提供给的不同请求代码整数 getActivity(Context,int,Intent,int),getActivities(Context,int, Intent [],int),getBroadcast(Context,int,Intent,int)或 getService(Context,int,Intent,int)。
如果你一次只需要一个PendingIntent激活 您将使用的意图,然后您也可以使用标志 要取消或修改FLAG_CANCEL_CURRENT或FLAG_UPDATE_CURRENT 无论当前的PendingIntent与您的意图相关联 供给。