哪一种在特定时间调用特定功能的最佳方法,作业调度程序或警报管理器

Which one best method for call a specific function at specific time , Job scheduler or alarm manager

我正在与硬件通信蓝牙设备。我想在特定时间将数据发送到蓝牙模块,这是安排呼叫功能的最佳方法,我应该使用警报管理器或作业调度程序。

您应该使用 AlarmManager。您将无法使用 Jobscheduler 进行控制。 JobScheduler 中的计划作业将根据您无法影响的 OS 定义的标准执行。如果您的用例需要在特定时间执行,那么 AlarmManager 应该是您的选择。

基于documentation

Standard AlarmManager alarms (including setExact() and setWindow()) are deferred to the next maintenance window.

  • If you need to set alarms that fire while in Doze, use setAndAllowWhileIdle() or setExactAndAllowWhileIdle().
  • Alarms set with setAlarmClock() continue to fire normally — the system exits Doze shortly before those alarms fire.

这取决于你的任务,如果你想在应用程序被杀死时执行任务并且设备处于 DOZE 模式,那么请使用带有作业调度程序的警报管理器,否则你可以使用作业调度程序。

这是设置闹钟的正确方法。

public static void startAlarm(Context context, int minutes) {
        Logger.print("AlarmReceiver startAlarm  called");
        Intent alarmIntent = new Intent(context, WakefulBroadcastReceiverService.class);
        alarmIntent.setAction("testAPP");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 123451, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        manager.cancel(pendingIntent);
        long alarmPeriodicTime = System.currentTimeMillis() + Utils.getTimeInMilliSec(Constant.TimeType.MINUTE, minutes);
        if (Build.VERSION.SDK_INT >= 23) {
            manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmPeriodicTime, pendingIntent);
        } else if (Build.VERSION.SDK_INT >= 19) {
            manager.setExact(AlarmManager.RTC_WAKEUP, alarmPeriodicTime, pendingIntent);
        } else {
            manager.set(AlarmManager.RTC_WAKEUP, alarmPeriodicTime, pendingIntent);
        }
    }

Job Scheduler 用户请使用 FirebaseJob dispatcher 以获得低版本支持