使用作业调度程序在特定时间然后以特定间隔重复作业

Using job scheduler to repeat a job at specific time and then at specific intervals

目标:构建一个提醒我在机器上打卡的应用程序。早上 8 点开始,每 10 分钟重复一次。每次都会用TexttoSpeech提醒打卡

基础服务和activity已经到位。 JobScheduler如何在特定的时间和分钟运行,然后每10分钟运行一个作业直到特定的时间?

public class Util {
    public static void scheduleJob(Context context) {
        ComponentName serviceComponent = new ComponentName(context, TestJobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
        jobScheduler.schedule(builder.build());
    }
}

public class MyStartServiceReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Util.scheduleJob(context);
    }
}

public class TestJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        Intent service = new Intent(getApplicationContext(), TestVoice.class);
        getApplicationContext().startService(service);
        Util.scheduleJob(getApplicationContext()); // reschedule the job
        return true;
    }
    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        return true;
    }
}

public class TestVoice extends AppCompatActivity {
    TextToSpeech tts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tts = new TextToSpeech(this, new TextToSpeech.OnInitListener(){
            @Override
            public void onInit(int status) {
                // TODO Auto-generated method stub
                if(status == TextToSpeech.SUCCESS){
                    int result=tts.setLanguage(Locale.US);
                    if(result==TextToSpeech.LANG_MISSING_DATA ||
                            result==TextToSpeech.LANG_NOT_SUPPORTED){
                        Log.e("error", "This Language is not supported");
                    }
                    else{
                        ConvertTextToSpeech("Have you punched in?");
                    }
                }
                else
                    Log.e("error", "Initilization Failed!");
            }
        });
    }
    private void ConvertTextToSpeech(String text) {
        // TODO Auto-generated method stub

        if(text==null||"".equals(text))
        {
            text = "Content not available";
            tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
        }else
            tts.speak(text+"is saved", TextToSpeech.QUEUE_FLUSH, null);
    }
}

How can JobScheduler be run at a specific hour and minute, and then run a job every 10 minutes till a specific time?

不能。

JobScheduler 本质上是不准确的。您提供了关于工作何时 运行 以及工作 运行 何时 运行。

的一般指导

特别是在 Android 6.0+ 上,除了 setAlarmClock()AlarmManager 上,没有什么可以满足您的要求。但是,使用它会产生 UI 影响,因为它是为闹钟应用程序设计的。将它用于您想要的目的也可能会干扰设备上的任何实际闹钟应用程序(如果这是 BYOD 场景,而不是公司发行的设备)。此外,setAlarmClock() 是一次性事件;作为处理上一个事件的一部分,您需要再次调用 setAlarmClock(),以安排您希望再次获得控制权的时间。