Xamarin AlarmManager Android
The problem is that your BroadcastReceiver
does not have the [BroadcastReceiver
] attribute.
This code works:
AlarmReceiver.cs
[BroadcastReceiver]
public class AlarmReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var message = intent.GetStringExtra("message");
var title = intent.GetStringExtra("title");
var resultIntent = new Intent(context, typeof(MainActivity));
resultIntent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
var pending = PendingIntent.GetActivity(context, 0,
resultIntent,
PendingIntentFlags.CancelCurrent);
var builder =
new Notification.Builder(context)
.SetContentTitle(title)
.SetContentText(message)
.SetSmallIcon(Resource.Drawable.Icon)
.SetDefaults(NotificationDefaults.All);
builder.SetContentIntent(pending);
var notification = builder.Build();
var manager = NotificationManager.FromContext(context);
manager.Notify(1337, notification);
}
}
MainActivity.cs
[Activity(Label = "App3", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
var button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += delegate
{
var alarmIntent = new Intent(this, typeof(AlarmReceiver));
alarmIntent.PutExtra("title", "Hello");
alarmIntent.PutExtra("message", "World!");
var pending = PendingIntent.GetBroadcast(this, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
var alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
alarmManager.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + 5*1000, pending);
};
}
}
Nebri
Updated on June 07, 2022Comments
-
Nebri over 1 year
I've created a quick xamarin android project. Eventually I will want to take the learning below and apply it to a xamarin forms project that is shared between android and ios. For now I'm just focusing on the Android side of things.
I've been trying to learn how to schedule a local notification to appear at some time in the future. Made a quick throw away application, below is the AlarmReceiver Class I've written, as well as the MainActivity.cs below.
class AlarmReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { var message = intent.GetStringExtra("message"); var title = intent.GetStringExtra("title"); var notIntent = new Intent(context, typeof(MainActivity)); var contentIntent = PendingIntent.GetActivity(context, 0, notIntent, PendingIntentFlags.CancelCurrent); var manager = NotificationManager.FromContext(context); //Generate a notification with just short text and small icon var builder = new Notification.Builder(context) .SetContentIntent(contentIntent) .SetContentTitle(title) .SetContentText(message) .SetWhen(Java.Lang.JavaSystem.CurrentTimeMillis()) .SetAutoCancel(true); var notification = builder.Build(); manager.Notify(0, notification); } } public class MainActivity : Activity { // Unique ID for our notification: private static readonly int ButtonClickNotificationId = 1000; // Number of times the button is tapped (starts with first tap): private int count = 1; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); // Display the "Hello World, Click Me!" button and register its event handler: Button button = FindViewById<Button>(Resource.Id.MyButton); button.Click += ButtonOnClick; } // Handler for button click events. private void ButtonOnClick(object sender, EventArgs eventArgs) { Intent alarmIntent = new Intent(Application.Context, typeof(AlarmReceiver)); alarmIntent.PutExtra("message", "This is my test message!"); alarmIntent.PutExtra("title", "This is my test title!"); PendingIntent pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent); AlarmManager alarmManager = (AlarmManager)Application.Context.GetSystemService(Context.AlarmService); alarmManager.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + 1 * 1000, pendingIntent); } }
When I step through and debug this, it appears that my OnReceive method is not being called.
I was following this article as I'm having a really tough time researching how to do this correctly via google searches. Here: Scheduled Notifications
If anyone could share some wisdom, would greatly appreciate it.
-
Nebri over 7 yearsAlright we're making progress. Yes after adding in the [BroadcastReceiver] I am seeing the debugger hitting my break points inside the OnReceive method. However the notification itself is still not appearing in my tests. We're about half way there now.
-
Cheesebaron over 7 yearsIt seems like when not setting any Icon for it it wont show up. Let me update my answer.
-
sudharsan chandrasekaran about 6 yearshow to repeating alarm with particular minutes of time interval
-
Cheesebaron about 6 years@sudharsanchandrasekaran create a new question describing your problem.