2017-07-06 111 views
2

目标:构建一个让我想起了在机器上一拳的应用程序。它将在上午8点开始,每10分钟重复一次。每一次,它会使用文字转语音提醒我一拳。使用Job Scheduler在特定的时间,然后重复工作在特定的时间间隔

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

“然后运行作业每10分钟” - IMO根本,如果你在牛轧糖或更高,并且设备进入休眠模式 - 我试图与这两个模拟器和“真实”的设备,间隔有时只是超过10次,有时(10'片)接近23分钟。 – 0X0nosugar

回答

1

如何的jobscheduler在特定小时和分钟来运行,然后运行作业每10分钟至一个特定的时间?

这不可能。

JobScheduler在本质上是不准确的。您提供了工作时间应运行的一般指导,并在工作时运行工作。

特别是在Android 6.0+上,除了setAlarmClock()AlarmManager之外,没有任何东西能够满足您的要求。但是,使用它会产生UI反响,因为它是为闹钟应用程序设计的。将其用于所需目的也可能会干扰设备上的任何实际闹钟应用程序(如果这是BYOD方案,而不是公司发布的设备)。另外,setAlarmClock()是一次性事件;您需要再次调用setAlarmClock()作为处理上一个事件的一部分,以计划何时再次获得控制权。

+0

那么解决方案是建立一个自定义的服务? – Droidzone

+2

@Droidzone:欢迎您尝试具有前景的服务,手动添加到电池优化白名单,并使用一些进程定时溶液(例如,'ScheduledExecutorService')。但是,这将需要连续的唤醒锁定。该设备的电池可能无法持续完整的工作班次。而且,如果这是BYOD情景,那么被迫使用您应用的人可能会以不幸的方式表达他们的不满。因此,我会首先关注'setAlarmClock()'方法,看看这是否足以满足您的需求。 – CommonsWare

+0

如果我使用像某些应用程序一样的持续通知,该怎么办?它仍然需要一个唤醒锁吗? – Droidzone