无法识别点击通知的项目的ID

时间:2015-08-05 15:20:13

标签: android android-notifications

我有多个通知,当我点击一个通知时,我需要将其发票ID从网络服务传递到其他Activity并显示其详细信息。

我面临的问题是,以下代码为我提供了所有通知的相同发票ID,我知道有些问题,但我无法弄明白。

请指出我的错误。

public class SampleSchedulingService extends IntentService {
    public SampleSchedulingService() {
        super("SchedulingService");
    }
    List<GetReminder> reminderList;
    int invoiceId=0;
    String remMes;
    InvoiceData1 data1;
    int  InvM_Id;
    public static final String TAG = "Scheduling Demo";
    public static int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;

    @Override
    protected void onHandleIntent(Intent intent) {
        // BEGIN_INCLUDE(service_onhandle)
        // The URL from which to fetch content.
        Log.d("MyService", "About to execute MyTask");
        reminderList = WebService.invokeGetReminderWS("GetReminder", 41);

        if(reminderList!=null){
            for(int i=0;i<reminderList.size();i++) {              sendNotification(reminderList.get(i).getRemMessage(),reminderList.get(i).getInvM_Id());
            }
        }
        // Release the wake lock provided by the BroadcastReceiver.
        SampleAlarmReceiver.completeWakefulIntent(intent);
        // END_INCLUDE(service_onhandle)
    }

    private void sendNotification(String msg, int invM_id) {

        try {
            Intent notificationIntent = new Intent(this, Result.class);
            notificationIntent.setAction(Intent.ACTION_MAIN);
            notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            data1=WebService.InvoiceDetailForExeedDiscount1(invM_id);
            notificationIntent.putExtra("invoiceList", data1);
            notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

            mNotificationManager = (NotificationManager)
                    this.getSystemService(Context.NOTIFICATION_SERVICE);

            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_launcher)
                          .setContentTitle(getString(R.string.invoice_alert))
                            .setStyle(new NotificationCompat.BigTextStyle()
                                    .bigText(msg))
                            .setContentText(msg);
            mBuilder.setContentIntent(contentIntent);
            mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
            NOTIFICATION_ID++;}
        catch (IOException e) {

        } catch (XmlPullParserException e) {

        }

    }
}

我需要根据我将数据传递到其他结果invm_id的每个通知获得不同的Activity

2 个答案:

答案 0 :(得分:1)

即使您不这么认为,您在所有通知中都使用相同的PendingIntent。这实际上显然是documented here

  

如果创建应用程序稍后重新检索相同类型的   PendingIntent(相同的操作,相同的Intent操作,数据,类别,   和组件,以及相同的标志),它将收到一个PendingIntent   如果仍然有效,则表示相同的令牌,因此可以调用   取消()删除它。

     

由于这种行为,了解两个Intent的时间非常重要   为了检索PendingIntent而被认为是相同的。   人们常犯的错误是创建多个PendingIntent   具有仅在“额外”内容中变化的Intent的对象,   期望每次获得不同的PendingIntent。事实并非如此   发生。

要解决此问题,您需要提供不同的requestCode,因此需要

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
             notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

你应该写

PendingIntent contentIntent = PendingIntent.getActivity(this, NOTIFICATION_ID,
             notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

答案 1 :(得分:-1)

此处标记FLAG_UPDATE_CURRENT

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,
    PendingIntent.FLAG_UPDATE_CURRENT);
  

指示如果描述的PendingIntent已经存在的标志,则保留它,但将其额外数据替换为此新Intent中的内容。用于getActivity(Context,int,Intent,int),getBroadcast(Context,int,Intent,int)和getService(Context,int,Intent,int)。

     

如果您要创建只有额外内容更改的意图,并且不关心接收到您之前的PendingIntent的任何实体将能够使用您的新附加功能启动它,即使未明确指定它们也可以使用它。

表示您创建的最后一个将替换前一个。为避免这种情况,您必须根据IntentFilter使用的条件使其不同:

  

您可以过滤三种意图特征:动作,数据和类别

您使用相同的操作和类别,并且不指定数据。它将使用您在Extras中放置的任何内容来过滤它们。我建议不要这样做:

        notificationIntent.putExtra("invoiceList", data1);

您以某种方式将data1转换为Uri,并Intent.setData()将其存储。