未选中所需的ListView项目

时间:2016-05-21 19:58:42

标签: android

活动的这段代码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());
    }

}

1 个答案:

答案 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与您的意图相关联   供给。