Articles of android jobscheduler

JobScheduler两次发布职位(不是预期的)

我正在写一篇关于JobScheduler的教程,我发现了一个奇怪的行为。 我要求在1秒钟内安排3个不同的作业(.setOverrideDeadline(1000)),但它们都被提交并运行了两次……所以这里的代码: public class MyApplication extends Application { private static final int JOB_ID_HanlderThread = 100; private static final int JOB_ID_ExecutorService = 200; private static final int JOB_ID_AsyncTask = 300; JobScheduler mJobScheduler; ExecutorService myExecutorServiceForJobs=null; private static MyApplication INSTANCE; public static MyApplication getInstance(){ return INSTANCE; } /** * Called when the application is starting, before any activity, […]

JobScheduler – 如何确定唯一的作业ID?

根据文档 ,作业必须具有每个uid唯一的作业ID。 如果我使用第三方库也安排工作,这是否意味着我不能使用与他们相同的工作ID? 如果是这样,我怎样才能避免这种碰撞?

Android java.lang.IllegalArgumentException:没有这样的服务ComponentInfo JobScheduler

我试图创建一个简单的JobScheduler作业,看看它是如何工作的。 但我一直在运行时遇到这个exception,我无法弄明白,因为我一步一步地按照指南。 这是我的电话: ComponentName componentName = new ComponentName(getApplicationContext(), TestService.class); JobInfo jobInfo = new JobInfo.Builder(1, componentName).setPeriodic(300000) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).build(); JobScheduler tm = (JobScheduler) getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE); tm.schedule(jobInfo); TestService不执行任何其他操作,然后扩展JobService。

Android JobScheduler:如果您定期安排相同的工作,它会再次开始这段时间吗?

如果我安排相同的定期工作(相同的工作ID)并且已经安排了工作,会发生什么? 它从一开始就再次开始吗? 例如,我将此方法调用两次: JobInfo myLongJob = new JobInfo.Builder( JOB_ID, new ComponentName(context, JobSchedulerLongService.class.getName()) ).setPeriodic(10000) .build(); jobScheduler.schedule(myLongJob); 第二次调度作业会导致周期性计时器再次开始计数吗?

Android JobScheduler – 无法创建持久作业

我正在尝试Android Lollipop附带的新JoScheduler API。 到目前为止,我已成功创建并运行了6000毫秒的延迟,没有网络要求而没有问题。 但是,我刚刚尝试通过使用setPersisted(true)函数来保持相同的工作。 一旦调用了job build()函数,它就会失败,说我需要Manifest文件中的RECEIVED_BOOT_COMPLETED权限。 但我已经添加了许可: 我甚至在添加作业之前添加了以下代码,以查看应用是否已注册权限: PackageManager pm = context.getPackageManager(); int hasPerm = pm.checkPermission(Permission.RECEIVE_BOOT_COMPLETED, context.getPackageName()); if (hasPerm == PackageManager.PERMISSION_GRANTED) { // Goes into here every time } 但是,当作业生成时,我收到以下错误: java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission. 我的代码创建并将作业添加到JobSchedular: ComponentName serviceComponent = new ComponentName(getApplicationContext(), MyJobService.class); JobInfo.Builder builder = new JobInfo.Builder(1, serviceComponent) .setMinimumLatency(6000) […]

Android JobScheduler执行了好几次

我使用以下代码使用Androids JobScheduler API创建和安排作业: Log.d(“hanif”, “Scheduling periodic job 2 hrs with 20 mins backoff linear”); JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(getApplicationContext(), MyJobService.class)) .setPeriodic(TimeUnit.HOURS.toMillis(2)) .setRequiresCharging(true) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setBackoffCriteria(TimeUnit.MINUTES.toMillis(20), JobInfo.BACKOFF_POLICY_LINEAR) .build(); JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); scheduler.schedule(jobInfo); 即每2小时执行一次定期工作,如果工作失败,执行20分钟*的线性退避策略将失败。 我的工作服务代码编写如下: public class MyJobService extends JobService { @Override public boolean onStartJob(JobParameters jobParameters) { Log.d(“hanif”, “onStartJob”); new MyWorker(getApplicationContext(), this, jobParameters).execute(); return […]

JobScheduler:控制从满足约束到正在运行的作业的延迟

我正在使用JobScheduler安排工作。 主要是我将它用于.setRequiredNetworkType()方法,它允许您指定只希望在建立网络连接(或更具体地说是未计量连接)时调度作业。 我正在使用以下相当简单的代码来安排我的工作: PersistableBundle extras = new PersistableBundle(); extras.putInt(“anExtraInt”, someInt); int networkConstraint = useUnmetered ? JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY; ComponentName componentName = new ComponentName(context, MyJobService.class); JobInfo jobInfo = new JobInfo.Builder(jobId, componentName) .setRequiredNetworkType(networkConstraint) .setExtras(extras) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(jobInfo); 因此,调度只有一个约束:网络连接(可以是“任何”或“未计量”)。 问题的简短版本 如何指定满足所有约束的最大延迟,以及实际运行作业,例如“在网络连接的2秒内运行作业”? 更长的版本(与ramblings) 问题 我发现,在某些设备上,如果在已经满足网络约束的时间段内安排作业,则作业将立即运行(或者足够快以便用户感知到)。 但是在其他设备上,即使已经有合适的网络连接(以便可以立即运行作业),在实际运行之前会有很长的延迟。 因此,如果这是对用户操作的响应,那么就会发现没有任何事情发生并且应用程序已损坏。 现在,我很清楚这可能是JobScheduler的意图……由系统来安排工作以最好地适应其他需求,并且无法保证作业将立即运行约束得到满足。 但是如果需要的话,能够对它进行一些控制会很好。 因此,对于按计划进行的工作,无需用户参与,让系统完全控制精确的时间是好的和良好的。 但是,当作业响应用户操作时,我希望工作能够毫不拖延地运行…假设网络连接存在。 (如果没有连接,则可以显示一条消息,表明在恢复网络连接时将执行操作,然后JobScheduler负责确保在网络恢复时运行作业。) setOverrideDeadline()不是解决方案? 我可以看到JobInfo.Builder确实有一个setOverrideDeadline()方法,这几乎就是我想要的。 但是,这指定了从安排作业开始的最大延迟(即,即使不满足所有约束,也在10秒内运行作业),而不是从满足所有约束的时间开始 […]

关于GcmTaskService的一些问题

背景 我想使用Lollipop上提供的新JobScheduler API,但遗憾的是它没有预先棒棒糖的官方端口。 但是,有GcmTaskService,它提供了非常相似的function。 问题 这个API很新,所以很少有地方可以查找如何使用它的信息(例如, 这里和这里 )。 问题 我对这个新API有几个问题: 它似乎需要使用Google Play服务( 此处 )(除非使用Lollipop版本的Android,它将使用普通的JobScheduler)。 如果Google Play服务不可用,我该怎么办? 似乎即使我使用“setPersisted(true)”来执行重复任务,当我重新启动设备时,也不会再次调用该任务。 怎么来的? 编辑:那是因为我错过了RECEIVE_BOOT_COMPLETED的许可。 如果我不使用“setRequiredNetwork”,任务的默认行为是什么? 是“NETWORK_STATE_ANY”吗? 文档说明了从onRunTask返回的内容,我可以返回任何值“RESULT_FAILURE”,“RESULT_RESCHEDULE”,“RESULT_SUCCESS”( 此处为 info)。 似乎FAILURE和SUCCESS选项都会做同样的事情 – 从队列中删除任务。 这是真的吗? 如果是这样,它们之间究竟有什么区别? 他们的function不同吗? “ TaskParams ”是否仅用于任务的标记? 我可以使用API​​以某种方式将捆绑包传递给任务吗? 否则,我需要设置一个DB来存储应该传递给任务的内容,对吗? 应用程序是否可以获取任务的队列? 我知道使用adb是可能的,但也可以使用API​​吗? 他们说( 这里 )每个任务都有一个长达3分钟的唤醒锁。 如果任务需要更多,应该怎么做? 它应该为自己获得另一个唤醒锁吗? API是否会警告唤醒锁被释放? 以下是文档所说的内容: 调度程序将为您的服务保留一个PowerManager.WakeLock,但是如果您的任务未返回,则执行三分钟后将被视为已超时,并且将释放唤醒锁。 此时重新安排任务将无效。 如果您怀疑任务的运行时间超过此时间,则应明确启动自己的服务或使用其他机制; 此API旨在用于相对快速的网络操作。 他们说( 这里 )每次应用程序升级/替换时都会删除所有网络任务,并且在发生这种情况时会调用“onInitializeTasks”,并且您可以再次重新安排它们。 我该如何重新安排任务? 我认为我甚至无法获得任务清单…… 有可能告诉任务更喜欢白天的特定时间吗? 例如,在14:00-15:00之间? […]

Job Scheduler与后台服务

我有一个应用程序,其functionA应该每分钟在后台运行。 functionA是应用程序应该连接到数据库,读取一些数据然后获取设备的当前位置,并根据它们检查条件,如果条件为真,它应该向用户发送状态栏通知,以便用户点击通知,将显示应用程序的UI并发生一些事情。 这个后台任务应该每分钟都运行一次,无论应用程序是否被使用,关闭,终止(例如facebook或Whatsapp向我们显示通知,无论它们是否在应用程序堆栈中)。 现在我已经搜索并发现Android提供Job Scheduler , 后台服务 , AlarmManager和处理程序 。 但是我越了解他们,这些陈述对我来说就越矛盾。 关于处理程序我已经读过它们不存在长时间延迟,并将在系统重启后终止。 所以他们不适合我的任务。 但是AlarmManager似乎是这个问题的一个很好的候选者,因为在允许的情况下它们甚至在系统重启后也存在,并且可以重新运行应用程序。 但在Android文档中,Alarm Manager旨在用于必须在特定时间运行的任务(如闹钟)。 但我的任务必须每分钟运行一次。 然后是后台服务。 这更像是我在阅读后在后台下载的任务,而不是用于我已经解释过的事情。 JobScheduler似乎不是为了必须永久完成的任务,而是为了满足特定约束的任务,如空闲或没有网络……那么你建议使用哪些(或其他的,如果它们存在)对于我在第一部分中解释的任务

Job Scheduler与后台服务

我有一个应用程序,它具有每分钟应该在后台运行的functionA. functionA是应用程序应该连接到数据库,读取一些数据,然后获取设备的当前位置,并根据它们检查条件,如果条件为真,则应该向用户发送状态栏通知,以便当用户点击通知应用程序的用户界面将显示,并发生一些事情。 这个后台任务应该每分钟运行一次,无论应用程序是否被使用,closures,终止(就像facebook或Whatsapp向我们显示通知,无论他们是否在应用程序堆栈中)。 现在我已经search并发现Android提供了Job Scheduler , Background Service , AlarmManager和Handlers 。 但是,我越读到他们,这些陈述就越是矛盾。 1.关于处理程序我已经读过,它们不存在长时间的延迟,并将在系统重新启动后终止。 所以他们不适合我的任务。 2.但AlarmManager似乎是一个很好的候选人的问题,因为如果允许他们存在,即使系统重新启动,并可以重新运行应用程序。 但在Android文档中,警报pipe理器旨在用于必须在特定时间运行的任务(如闹钟)。 但我的任务必须每分钟运行一次。 3.然后是后台服务。 这是更多的任务,像我已经阅读的背景下载,并不打算做我已经解释的东西。 4. JobScheduler似乎不是一个需要永久完成的任务,而是完成特定约束的任务,比如空闲或者没有networking。 那么,这些(或者其他的,如果存在的话)是否推荐用于我在第一部分中解释的任务