【问题标题】:Xamarin service - run according to a time scheduleXamarin 服务 - 根据时间表运行
【发布时间】:2020-04-21 21:13:31
【问题描述】:

我正在开发基于此示例的应用程序:https://github.com/xamarin/mobile-samples/tree/master/BackgroundLocationDemo

该示例有效,并且位置更新按预期进行。但是,Android 不断显示服务正在运行并耗尽电池的通知。现在,我所有的用户都有一个定义的工作时间表(每天开始到结束日期时间的列表,例如上午 8 点至下午 1 点、下午 4 点至晚上 8 点),并且我希望该服务仅在这些工作时间之间运行。这意味着我需要在时间表显示用户是否在工作时启动/停止服务。

我以前问过这个问题,但想知道是否有人想出一种有效而可靠的方法来实现这种按时间安排运行的服务?

【问题讨论】:

    标签: android xamarin schedule background-service foreground-service


    【解决方案1】:

    您可以使用AlarmManager在特定时间执行任务。

    例如,我希望我的任务在每天上午 10:51 运行,我可以使用以下代码来执行它。

     public static void startAlarmBroadcastReceiver(Context context)
            {
                Intent _intent = new Intent(context, typeof( AlarmBroadcastReceiver));
                PendingIntent pendingIntent = PendingIntent.GetBroadcast(context, 0, _intent, 0);
                AlarmManager alarmManager = (AlarmManager)context.GetSystemService(Context.AlarmService);
                // Remove any previous pending intent.
                alarmManager.Cancel(pendingIntent);
    
                Calendar cal = Calendar.Instance;
                cal.Set( CalendarField.HourOfDay, 10);
                cal.Set(CalendarField.Minute, 51);
                cal.Set(CalendarField.Second, 0);
    
                alarmManager.SetRepeating(AlarmType.RtcWakeup, cal.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);
    
    
           }
    

    这是关于AlarmBroadcastReceiver的代码。

        [BroadcastReceiver(Enabled = true, Exported = false)]
        public class AlarmBroadcastReceiver : BroadcastReceiver
        {
            public override void OnReceive(Context context, Intent intent)
            {
                Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
            }
        }
    

    不要忘记添加以下权限。

    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
    

    这是正在运行的 gif。

    【讨论】:

    • 感谢您的精彩回复和 Leon 示例!这是最直接的方法,但如果我有更复杂的时间表怎么办?例如周一上午 8 点至下午 2 点和下午 4 点至晚上 8 点,周二上午 9 点至晚上 10 点和下午 2 点至下午 6 点?
    • 如果你想在Calendar添加工作日,你可以参考这个帖子。 stackoverflow.com/questions/19051622/…
    • 问题不是计算工作日或时间,而是输入到 SetRepeating 调用。据我了解,我想做的事不能用 SetRepeating 函数完成
    • 你的应用程序总是在前台运行吗?
    • 是的,它是一个前台服务。重点是在用户工作时间接收位置更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多