如何知道一个 JobScheduler 是否正在运行?

7

当我调用代码A后,即使我关闭应用程序,JobScheduler也会继续运行。

但是一些自定义 Android 系统可能会在关闭应用程序时清除 JobScheduler

如何以编程方式检查 JobScheduler 是否正在运行?

代码 A

private fun startScheduleRestore(mContext:Context){
   logError("Start Server")

   val interval=if (isDebug())
                    10*1000L
                 else
                    mContext.getInteger(R.integer.AutoRestoreInterval)*60*1000L

    val mJobScheduler = mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

    val jobInfo = JobInfo.Builder(mContext.getInteger(R.integer.JobID), ComponentName(mContext, RestoreService::class.java))
                        .setPeriodic(interval)
                        .setPersisted(true)
                        .build()

    mJobScheduler.schedule(jobInfo)
}

代码 B

private fun stopScheduleRestore(mContext:Context){
    logError("Stop Server")

    val mJobScheduler = mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
    mJobScheduler.cancel(mContext.getInteger(R.integer.JobID))

}
3个回答

6
您可以使用JobScheduler的getAllPendingJobs方法。根据文档

列出应用程序所有已安排的作业列表。这包括当前已启动的作业以及仍在等待运行的作业。

public static boolean isJobSchedulerRunning(final Context context) {
    final JobScheduler jobScheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE );    
    return jobScheduler.getAllPendingJobs().size() > 0;
}

如果想要检查特定的JobId是否仍然有效,您可以执行以下操作:

public static boolean isJobIdRunning( Context context, int JobId) {
    final JobScheduler jobScheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;

    for ( JobInfo jobInfo : jobScheduler.getAllPendingJobs() ) {
        if ( jobInfo.getId() == JobId ) {
           return true;
        }
    }

    return false;
}

“检查特定的JobId是否仍然有效”是什么意思?您是指它尚未启动还是实际正在运行(已调用onStartJob)?如果它是一个周期性作业,会发生什么?我总是从这个方法中得到true吗? - Vikalp

3

运行 Adb 命令

adb shell dumpsys jobscheduler

它将显示您已安排的工作列表,您可以识别自己的任务。

谢谢!但这不是以编程方式实现的方法。 - HelloCW

1

既然您知道工作 ID,您可以直接检查工作是否已安排:

JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
boolean isScheduled = jobScheduler.getPendingJob(JOB_ID) != null;
if (isScheduled) {
    // Your job is scheduled!
}

这种方法仅适用于API级别24及以上。有关更多信息,请参见getPendingJob(int)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接