我有多个通知,当我点击一个通知时,我需要将其发票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
。
答案 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()
将其存储。