微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

日历重复AlarmManager

如何解决日历重复AlarmManager

我在Android-Xamarin Forms Project上的计划通知中有一个小问题。我想将每日通知安排在17:00。它可以在模拟器上正常运行,但是当我将其部署在Samsung S7 Edge-Android 8.0上时,它将在17:00通知我,并且在打开通知后,它将在每分钟左右通知

这是我的代码MainActivity.cs:

[Activity(Label = "SpiritMobile",Icon = "@mipmap/icon",Theme = "@style/MainTheme",MainLauncher = true,ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        static readonly string CHANNEL_ID = "location_notification";
        internal static readonly string COUNT_KEY = "count";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this,savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this,savedInstanceState);

            LoadApplication(new App());

            CreateNotificationChannel();

            Intent alarmIntent = new Intent(this,typeof(AlarmReceiver));
            PendingIntent pending = PendingIntent.Getbroadcast(this,alarmIntent,PendingIntentFlags.UpdateCurrent);
            AlarmManager alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();

            var calendar = Calendar.Instance;
            calendar.TimeZone = Java.Util.TimeZone.GetTimeZone("Europe/Bucharest");
            calendar.Set(CalendarField.HourOfDay,17);
            calendar.Set(CalendarField.Minute,00);

            alarmManager.SetRepeating(AlarmType.RtcWakeup,calendar.TimeInMillis,AlarmManager.IntervalDay,pending);
        }
        public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);
            ServicePointManager.ServerCertificateValidationCallback += (o,cert,chain,errors) => true;

            base.OnRequestPermissionsResult(requestCode,grantResults);
        }

        void CreateNotificationChannel()
        {
            if (Build.VERSION.SdkInt < BuildVersionCodes.O)
            {
                return;
            }

            var channel = new NotificationChannel(CHANNEL_ID,"reminders",NotificationImportance.Default)
            {
                Description = "reminder's channel"
            };

            var notificationmanager = (notificationmanager)GetSystemService(NotificationService);
            notificationmanager.CreateNotificationChannel(channel);
        }
    }

然后我有了AlarmReceiver.cs:

[broadcastReceiver]
    public class AlarmReceiver : broadcastReceiver
    {
        public override void OnReceive(Context context,Intent intent)
        {
            var message = "Don't forget to submit your daily rates.";

            Intent backIntent = new Intent(context,typeof(MainActivity));
            backIntent.SetFlags(ActivityFlags.NewTask);

            var resultIntent = new Intent(context,typeof(MainActivity));

            PendingIntent pending = PendingIntent.GetActivities(context,new Intent[] { backIntent,resultIntent },PendingIntentFlags.Oneshot);

            var builder = new NotificationCompat.Builder(context,"location_notification")
                 .SetAutoCancel(true)
                 .SetContentTitle("Submit your daily feeling!")
                 .SetContentText(message)
                 .SetSmallIcon(Resource.Drawable.icon);

            builder.SetContentIntent(pending);
            var notificationmanager = notificationmanagerCompat.From(context);
            notificationmanager.Notify(1000,builder.Build());
        }
    }

能否请您告诉我这里出了什么问题?可能是什么原因造成的?

解决方法

您正在通过“活动”的OnCreate方法设置重复警报。因此,每次启动应用程序时,都会向AlarmManager注册一个新的警报。由于它是重复警报,您只需设置一次即可。

可以通过checking if your alarm is already set.

实现

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。