Reputation: 469
I am adding Intent
s into a Android.Support.V4.App.NotificationCompat.Builder
but the Extras
are not getting passed into an override of OnNewIntent
and it seems that the parameter is always the same Intent
. The idea is foreach
notification in the user's notification list my app creates a custom notification object and then creates a Bundle
and an Intent
.
//custom notification class just contains the information for notifications
public class CustomNotification
{
public string _noteType { get; set; }
public string _noteText { get; set; }
public string _noteLink { get; set; }
public int _noteIndex { get; set; }
}
public void SendNotifications(List<CustomNotification> notificationList)
{
try
{
var _ctx = Android.App.Application.Context;
int _noteCount = 0;
foreach (var note in notificationList)
{
//I'm instantiating a new Intent foreach so not sure why
// each would not have it's own Extras
var resultIntent = new Intent(_ctx, typeof(MainActivity));
var valuesForActivity = new Bundle();
valuesForActivity.PutInt(MainActivity.COUNT_KEY, _count);
//this will always be the same string when it hits OnNewIntent in MainActivity
valuesForActivity.PutString("URL", note._noteLink);
//this will always be the same number when it hits OnNewIntent in MainActivity
valuesForActivity.PutInt("NoteNumber", _noteCount);
resultIntent.PutExtras(valuesForActivity);
var resultPendingIntent = PendingIntent.GetActivity(_ctx, 0, resultIntent, PendingIntentFlags.UpdateCurrent);
resultIntent.AddFlags(ActivityFlags.SingleTop);
// Build the notification:
var builder = new Android.Support.V4.App.NotificationCompat.Builder(_ctx, MainActivity.CHANNEL_ID)
.SetAutoCancel(true) // Dismiss the notification from the notification area when the user clicks on it
.SetContentIntent(resultPendingIntent) // I'm passing the Intent here.. the rest of the builder vars work
.SetContentTitle(note._noteType) // Set the title
.SetNumber(_count) // Display the count in the Content Info
.SetSmallIcon(2130837590) // This is the icon to display
.SetContentText(note._noteText);
MainActivity.NOTIFICATION_ID++;
var notificationManager = Android.Support.V4.App.NotificationManagerCompat.From(_ctx);
notificationManager.Notify(MainActivity.NOTIFICATION_ID, builder.Build());
_noteCount++;
}
}
catch
{
}
}
//this is inside MainActivity.cs
protected override void OnNewIntent(Intent intent)
{
string url = "";
int noteCount = 0;
if (intent != null)
{
//this is always the same url
url = intent.Extras.GetString("URL");
//this is always the same int
noteCount = intent.Extras.GetInt("NoteNumber");
}
try
{
switch (_viewPager.CurrentItem)
{
case 0:
_fm1.LoadCustomUrl(url);
break;
case 1:
_fm2.LoadCustomUrl(url);
break;
case 2:
_fm3.LoadCustomUrl(url);
break;
case 3:
_fm4.LoadCustomUrl(url);
break;
case 4:
_fm5.LoadCustomUrl(url);
break;
}
}
catch
{
}
base.OnNewIntent(intent);
}
I would expect that when I pass the Intent
into the builder it would return a unique value but the same string always returns no matter which notification I click. I've stepped through the code as each notification is built and a unique string is being passed into each Intent
. What did I do wrong here?
Upvotes: 0
Views: 414
Reputation: 14956
var resultPendingIntent = PendingIntent.GetActivity(_ctx, 0,resultIntent, PendingIntentFlags.UpdateCurrent);
Extra will be updated to the Extra of the last incoming Intent,so you would get the same extra. If you need to get the correct extra for each notification ,there are two methods:
1.When you define intents, you also need to distinguish between intents ! You could add the code under the intent, like this:
resultIntent.SetData(Android.Net.Uri.Parse("custom://" + SystemClock.CurrentThreadTimeMillis()));
2. var resultPendingIntent = PendingIntent.GetActivity(_ctx, 0, resultIntent, PendingIntentFlags.UpdateCurrent);
change to :
var resultPendingIntent = PendingIntent.GetActivity(_ctx, MainActivity.NOTIFICATION_ID, resultIntent, PendingIntentFlags.UpdateCurrent);
Upvotes: 1