1. CountDownTimer
介绍: 定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。
参数: millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。(倒计时时间,单位毫秒) countDownInterval 接收onTick(long)回调的间隔时间。(单位毫秒)
公共方法:
- public final void cancel () 取消倒计时(取消后,再次启动会重新开始倒计时)
- public abstract void onFinish () 倒计时完成时被调用
- public abstract void onTick (long millisUntilFinished) 固定间隔被调用, 参数 millisUntilFinished 倒计时剩余时间。
- public synchronized final CountDownTimer start () 启动倒计时
CountDownTimer countDownTimer = new CountDownTimer(30000, 1000) {
@Override public void onTick(long millisUntilFinished) {
Log.e(TAG, "seconds remaining: " + millisUntilFinished / 1000);
}
@Override public void onFinish() {
Log.e(TAG, "done!");
}
};
countDownTimer.start();
2. JobService
1). 自定义类继承JobService
/**
* Job服务
*/
class TestJobService : JobService() {
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun onStartJob(params: JobParameters?): Boolean {
L.e("onStartJob: " + params.toString())
// job结束 ,参数二:需要再一次schedule,设置为false则不再执行
jobFinished(params, true)
return true
}
override fun onStopJob(params: JobParameters?): Boolean {
L.e("onStopJob: " + params.toString())
return true
}
}
2). 开启服务
// 获取JobScheduler服务
jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
// val time = 15 * 60 * 1000
val time = 15
// 指定哪个JobService执行操作
val builder = JobInfo.Builder(1, ComponentName(this, TestJobService::class.java))
if (time >= 15 * 60 * 1000) {
// 设置重复时间, 单位ms
builder.setPeriodic(15 * 60 * 1000)
// 设置持久化
builder.setPersisted(true)
// 设置网络类型
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
} else {
// 执行最小延时时间
builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10))
// 执行最长延时时间
builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(10))
// 线性重试方案
builder.setBackoffCriteria(TimeUnit.SECONDS.toMillis(10), JobInfo.BACKOFF_POLICY_LINEAR)
// 未充电状态
builder.setRequiresCharging(false)
}
// 执行任务
jobScheduler!!.schedule(builder.build())
注:如果重复JobService服务的时长小于15分钟,则需要使用else语句块中的代码,否则会报如下警告
W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms
3). 结束
jobScheduler?.cancel(1)
4). 完整代码
class JobActivity : AppCompatActivity() {
private var jobScheduler: JobScheduler? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_job)
}
/**
* 开启Job服务
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
fun onStartService(view: View) {
// 获取JobScheduler服务
jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
// val time = 15 * 60 * 1000
val time = 15
// 指定哪个JobService执行操作
val builder = JobInfo.Builder(1, ComponentName(this, TestJobService::class.java))
if (time >= 15 * 60 * 1000) {
// 设置重复时间, 单位ms
builder.setPeriodic(15 * 60 * 1000)
// 设置持久化
builder.setPersisted(true)
// 设置网络类型
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
} else {
// 执行最小延时时间
builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10))
// 执行最长延时时间
builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(10))
// 线性重试方案
builder.setBackoffCriteria(TimeUnit.SECONDS.toMillis(10), JobInfo.BACKOFF_POLICY_LINEAR)
// 未充电状态
builder.setRequiresCharging(false)
}
// 执行任务
jobScheduler!!.schedule(builder.build())
}
/**
* 关闭Job服务
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
fun onStopService(view: View) {
// 使用?时,应用程序不崩溃,并且点击按钮无反应
jobScheduler?.cancel(1)
}
}