使用JobSchedule对任务进行合理排期

转载自: https://www.cnblogs.com/ouyanliu/p/7220279.html?utm_source=itdadao&utm_medium=referral

JobSchedule 是 Android 5.0之后添加进去的, 之前的版本没有.

JobSchedule 原理是一种将任务安排在恰当的实际进行操作一种方案机制. 具体提供了那些可选的时机, 如下:

  1. 在可用网络下执行. 在7.0 之前, 应用可以通过监听网络变化来执行任务, 当然了前提是应用必须存活. 7.0之后这类API已经失效, 而JobSchedule机制提供了网络变化的监听. 进一步可以在网络变化的情况下执行某些操作. 例如在wifi环境下执行下载任务等.
  2. 设备在充电或者空闲时执行一些任务.
  3. 设定执行的时间, 这个和上述两条条件一起使用.
具体的实现如下:

1 任务排期

//获取 JobScheduler 实例
final JobScheduler scheduler = context.getSystemService(JobScheduler.class);
//或者
final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );

//构建JobInfo  jobId 为jobID. BusinessService 为Job接受的Service, 该Service必须继承JobService
final JobInfo.Builder builder = new JobInfo.Builder(jobId, new ComponentName(context,  BusinessService.class));

//设置设备重启是执行此任务. 前提是需要拥有RECEIVE_BOOT_COMPLETED  权限
builder.setPriority(JobInfo.PRIORITY_FOREGROUND_APP);
//这个设置并不能设置成为前台进程. 通知还需要应用自己发. 此外该设置会忽略该任务的网络限制. 
builder.setFlags(JobInfo.FLAG_WILL_BE_FOREGROUND);
//设置任务延迟执行时间, 不可与setPeriodic(long time)同时使用
builder.setMinimumLatency(time);

//设置设备执行的网络条件JobInfo.NETWORK_TYPE_UNMETERED 不计量网络(wifi), JobInfo.NETWORK_TYPE_NOT_ROAMING 非漫游网络,  NETWORK_TYPE_ANY任何网络
//JobInfo.NETWORK_TYPE_NONE 无论是否有网络都执行
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);

//设置在设备充电时执行
builder.setRequiresCharging(true);
//设置在设备空闲时间执行
builder.setRequiresDeviceIdle(true);

//循环每5秒执行一次
builder.setPeriodic(5000);

//约定的时间内的条件都没有被触发是5秒以后开始触发
builder.setOverrideDeadline(5000);

//生成Job
JobInfo job = builder.build();

//安排Job, 该方法有返回值 JobScheduler.RESULT_SUCCESS 表示安排成功, JobScheduler.RESULT_FAILURE 安排失败
scheduler.schedule(job)

//如果当前的jobId已经被安排了则下取消该安排
final int jobId = (int) info.mId;
scheduler.cancel(jobId);

//安排Job,  packageName 表示那个应用安排的Job(耗电记这个应用的).  userId表示谁安排的Job
scheduler.scheduleAsPackage(builder.build(),  packageName,  UserHandle.myUserId(),  TAG);

2 处理任务.

 当任务安排下去, 应该会被记录在JobScheduler服务里面. 当条件满足时, 处理job对应的JobService会被启动, 否则. . .

 首先配置和定义JobService

<!– 第二行这个地方必须是true, 否则外界的应用无法启动该JobService >
<!– 第三行必须定义这个权限 >
<service
    android:name=".BusinessService"
    android:exported="true"
    android:permission="android.permission.BIND_JOB_SERVICE"
/>
public class BusinessService extends JobService {
        //开始执行Job接口. (必须实现)如果返回false则表示这个Job已经被执行完毕. 如果true则表示这个Job正在被执行. 
        public boolean onStartJob(JobParameters params) {
            final int id = params.getJobId();
            //....开始执行Job

            //1 对于一个瞬间能够完成的任务, 此处可以return false. 
            //2 如果是耗时任务, 则需要在异步线程中执行, 并且返回true. 此外执行完后不要忘记执行jobFinished
            myHandler.removeMessages(id);
            myHandler.sendEmptyMessage(id);
        }

        //Job执行停止, 必须实现,  当接收到任务取消时, 如果该任务没有被结束, 则执行该方法, 否则不执行. 
        public boolean onStopJob(JobParameters params) {
            //此处可以重新安排被取消的任务. 
            scheduler.schedule(job)
        }
        //还有一个方法. jobFinished(JobParameters params, boolean needsRescheduled) 该方法是在任务执行完成时通知系统(不代表任务被执行成功). needsRecheduled表示该任务是否被重复执行. 
        //例如onStartJob执行结果是true. 则实际上任务还在执行. 
        //如果这时候任务执行完了. 就必须调用这个方法否则后面的任务无法进行.  
    }

总结, Scheduler是一套提供给开发者的一套优化耗电的任务安排方式.

其他耗电优化方式请看  app耗电优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用SQL Server Agent来定时执行存储过程。以下是一个示例脚本: ```sql USE [msdb] GO DECLARE @jobId BINARY(16) EXEC msdb.dbo.sp_add_job @job_name=N'MyJobName', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'This job executes my stored procedure', @category_name=N'[Uncategorized (Local)]', @owner_login_name=N'sa', @job_id = @jobId OUTPUT EXEC msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Execute SP', @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_fail_action=2, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'EXEC dbo.MyStoredProcedure', @database_name=N'MyDatabase', @output_file_name=N'\\MyServer\MyShare\MyJobOutput.txt', @flags=0 EXEC msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'MyJobSchedule', @enabled=1, @freq_type=4, @freq_interval=1, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=0, @active_start_date=20220224, @active_end_date=99991231, @active_start_time=0, @active_end_time=235959 EXEC msdb.dbo.sp_add_jobserver @job_id=@jobId, @server_name=N'(local)' GO ``` 这个脚本创建了一个名为"MyJobName"的作业,该作业会执行名为"MyStoredProcedure"的存储过程,并且每天都会执行一次。你需要将"@command"参数中的存储过程名,"@database_name"参数中的数据库名以及"@freq_*"参数中的执行时间间隔修改为你的实际情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值