使用startJob是可以执行定时脚本,但是我不想重新执行脚本,我只想在原有脚本运行的基础上每天定时执行写作业代码,那么就有了此文章:
正常默认是有Calendar权限的,如果没有,请查看mainfest声明:
android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR
首先 diy.java,填入以下源码。
public String everyDayTask(int Hours,int Minutes,int Seconds,final Runnable runnable){
long PERIOD_DAY = 24 * 60 * 60 * 1000; //间隔一天
//得到日历实例,主要是为了下面的获取时间
Calendar mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(System.currentTimeMillis());
//获取当前毫秒值
long systemTime = System.currentTimeMillis();
//是设置日历的时间,主要是让日历的年月日和当前同步
mCalendar.setTimeInMillis(System.currentTimeMillis());
// 这里时区需要的话就设置,如果仅在中国使用则定义
//mCalendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
//设置在几点提醒
mCalendar.set(Calendar.HOUR_OF_DAY, Hours);
//设置在几分提醒
mCalendar.set(Calendar.MINUTE, Minutes);
//下面秒数和毫秒
mCalendar.set(Calendar.SECOND, Seconds);
mCalendar.set(Calendar.MILLISECOND, 0);
//获取上面设置的定时的毫秒值
long selectTime = mCalendar.getTimeInMillis(); //startTime 毫秒
// 方法一:如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if(systemTime > selectTime) {
mCalendar.add(Calendar.DAY_OF_MONTH, 1);
} //System.out.println(date);
// 方法二:如果当前时间大于设置的时间,那么就从第二天的设定时间开始
/*
if (mCalendar.getTime().before(new Date())) {
mCalendar.add(Calendar.DAY_OF_MONTH, 1);
}
*/
task = new TimerTask() {
@Override
public void run() {
// 逻辑处理,这里用的回调,线程的
runnable.run();
}
};
Timer timer = new Timer();
//YouDiy task = new StateZeroController();
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task,mCalendar.getTimeInMillis()-systemTime,PERIOD_DAY); //方法一
//timer.schedule(task,mCalendar.getTime(),PERIOD_DAY); //方法二
return mCalendar.getTime().toLocaleString();
}
public void cancelEveryDayTask(){
if (task != null) {
task.cancel();
task = null;
}
}
然后在main.js调用的示例,假设我要固定每天晚上21:30写作业。
var diy=new com.plugin.tePlugin.diy();
//参数分别为:时,分,秒,执行fun
var taskT=diy.everyDayTask(21,30,0,function(){
callMe();
logd("定时写作业进行中,别打扰我");
});
logd("定时执行时间:"+taskT);
记得在程序终止时销毁,养成好习惯。
setExceptionCallback(function (msg){
logd(" 异常停止消息: "+msg);
diy.cancelEveryDayTask();
});
setStopCallback(function () {
logd("我是停止回调");
diy.cancelEveryDayTask();
thread.stopAll();
});
好了,简单记录一下。