xamarin 将AlarmManager通知设置为以可变间隔触发

hmmo2u0o  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(139)

我正在使用Xamarin开发一个Android应用程序。我试图弄清楚如何让它使用AlarmManager以可变间隔发送通知。我已经弄清楚如何触发通知并以固定间隔发送通知(比如每五分钟)。但是在某些情况下我希望间隔更动态。例如,假设我想在每天日落时收到通知。由于日落之间的时间间隔是变化的,我如何安排时间间隔会变化的通知?
下面是我的代码,适用于固定的时间间隔:

public void SendNotification( int      id
                            , string   title
                            , string   message
                            , DateTime notifyTime
                            , long     interval)
{
    if ( ! _channelInitialized)
    {
        CreateNotificationChannel();
    }

    var intent = new Intent(AndroidApp.Context
                          , typeof(AlarmHandler));
    
    intent.PutExtra(TitleKey
                  , title);

    intent.PutExtra(MessageKey
                  , message);

    var pendingIntent = PendingIntent.GetBroadcast(AndroidApp.Context
                                                 , id
                                                 , intent
                                                 , PendingIntentFlags.UpdateCurrent);

    var triggerTime  = GetNotifyTime(notifyTime);
    var alarmManager = AndroidApp.Context
                                 .GetSystemService(Context.AlarmService) as AlarmManager;
    
    alarmManager?.SetRepeating(AlarmType.RtcWakeup
                             , triggerTime
                             , interval
                             , pendingIntent);
}
0s0u357o

0s0u357o1#

这完全取决于你的闹钟响得有多准确,以及你是否事先知道间隔时间,或者它们是动态获得的。
因此,如果您事先知道时间间隔,则可以使用以下命令设置多个警报(通过在PendingIntent、docs上使用不同的id),使其在指定的时间间隔准确地发出

  • setExact(Android.应用程序.报警类型类型,长触发器AtMillis,Android.应用程序.挂起意图?操作)
  • 设置ExactAndAllowWhileIdle(安卓应用程序报警类型,长触发器,安卓应用程序挂起意图?操作)
  • setAlarmClock(闹钟管理器.闹钟信息信息,挂起意图操作)

例如,idk您的特定场景,但这里您有一个包含两个报警的通用示例:

var baseline = Java.Lang.JavaSystem.CurrentTimeMillis(); // Time from 1970
var time1 = baseline + TimeSpan.FromSeconds(5332).TotalMilliseconds;
var time2 = baseline + TimeSpan.FromSeconds(8900).TotalMilliseconds;

var id1 = DateTime.Now().TotalMilliseconds
var pendingIntentWithId1 = PendingIntent.GetBroadcast(AndroidApp.Context
                                                 , id1
                                                 , intent
                                                 , PendingIntentFlags.UpdateCurrent);

var pendingIntentWithId2 = PendingIntent.GetBroadcast(AndroidApp.Context
                                                 , id1 + 1
                                                 , intent
                                                 , PendingIntentFlags.UpdateCurrent);

var alarmManager = AndroidApp.Context
                                 .GetSystemService(Context.AlarmService) as AlarmManager;
    
alarmManager?.SetExact(AlarmType.RtcWakeup, 
                       time1, 
                       pendingIntentWithId1);

alarmManager?.SetExact(AlarmType.RtcWakeup, 
                       time2, 
                       pendingIntentWithId2);

如果需要动态更新间隔/时间,则需要创建一个在后台运行的Service,并更新AlarmManager上的警报,或者每次在BroadcastReceiver上接收警报时,设置下一个警报时间。
设置精确报警时要小心,因为它们会消耗资源,如果可能,应设置不精确报警。
此外,如果您要设置精确的警报,请记住设置适当的权限,如果您的目标是Android 12+:

  • 计划_精确_警报(这是目标Android 12+)
  • USE_EXACT_ALARM(这适用于Android 13+)

大多数情况下SCHEDULE_EXACT_ALARM就足够了,在下面的情况下可以使用后者:
您的应用程序是闹钟应用程序或计时器应用程序。您的应用程序是日历应用程序,用于显示即将发生的事件的通知

相关问题