使用作业计划程序在特定时间重复作业,然后按特定时间间隔重复作业

时间:2017-07-06 17:40:49

标签: android job-scheduling

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

基本服务和活动已经到位。 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);
    }
}

1 个答案:

答案 0 :(得分:1)

  

JobScheduler如何在特定的时间和分钟运行,然后每10分钟运行一次作业直到特定时间?

它不能。

JobScheduler本质上是不准确的。您可以提供有关何时应运行作业以及作业运行时运行的一般指导。

特别是在Android 6.0及更高版本上,除了setAlarmClock()上的AlarmManager之外,没有任何内容符合您的要求。但是,使用它会产生UI影响,因为它是专为闹钟应用程序设计的。将其用于所需目的也可能会干扰设备上的任何实际闹钟应用程序(如果这是BYOD方案,而不是公司发布的设备)。此外,setAlarmClock()是一次性事件;在处理上一个事件时,您需要再次致电setAlarmClock(),以便安排何时再次获得控制权。