Articles of android jobscheduler

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。 那么,这些(或者其他的,如果存在的话)是否推荐用于我在第一部分中解释的任务

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?

我的应用程序使用此经典模式来安排定期任务: 通过AlarmManager (通过setExactAndAllowWhileIdle()设置一个确切的警报,因为即使在setExactAndAllowWhileIdle()它也必须closures) 通过WakefulBroadcastReceiver.startWakefulService()从onReceive()开始一个IntentService 。 onHandleIntent()的工作,并在完成时调用WakefulBroadcastReceiver.completeWakefulIntent() 。 今天我更新了targetSdkVersion为26,并面临WakefulBroadcastReceiver不赞成使用的可怕事实。 我马上去阅读API文档,发现以下内容: 从Android O开始,背景检查限制使得这个类不再普遍有用。 (从收到广播开始一个服务通常是不安全的,因为你没有任何保证你的应用程序在这个时候处于前台,因此允许这样做。)相反,开发者应该使用android.app.job.JobScheduler来调度一个作业,而这并不要求应用程序保持一个唤醒锁,这样做(系统将负责保持作业的唤醒锁)。 这有点让我困惑,我不明白AlarmManager.setExactAndAllowWhileIdle()的用途是什么,而不能让设备保持清醒状态。 正如我看到我不能设置一个确切的时间来运行JobScheduler的工作,只有条件(如networkingtypes或充电状态),所以我不知道该怎么做在这里。 我想到了 一起使用AlarmManager和JobScheduler 设置一个闹钟(带有setExactAndAllowWhileIdle() ),并立即从onReceive()开始一个工作(通过JobScheduler onReceive() 。 由于JobScheduler提供了一个WakeLock , WakefulBroadcastReceiver不需要WakefulBroadcastReceiver 。 (这有道理吗?) 要么 继续使用WakefulBroadcastReceiver尽pipe不推荐使用。 我真的很感谢在这个问题上的任何build议。

广播充电器在Android O中断开

现在Android O的最终API已经发布,并且以下广播都没有列入白名单。我有以下问题: 在我的应用程序(目标API 25),我目前有一个BroadcastReceiver监听ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED系统事件。 现在我想更新我的应用程序来定位Android O,但是这个版本带来了广播行为的巨大变化 : 面向Android O的应用程序不能再在其清单中注册隐式广播的广播接收器。 隐式广播是一种广播,并不是专门针对该应用的。 由于这两个广播都是隐式的,所以我只能通过Context.registerReceiver()方法注册它们,但是问题是:一旦我的应用程序的进程被系统杀死,或者一旦系统清除了我的应用程序的内存由于设备内存不足),广播注册将会丢失。 为了避免这个问题,我可以使用JobScheduler API和ACTION_POWER_CONNECTED的setRequiresCharging方法,但对于ACTION_POWER_DISCONNECTED我必须使用registerReceiver方法。 由于我的应用程序控制设备的音量(基于这些事件),这些事件都不会被遗漏,这一点非常重要。 那么我怎样才能安全地监听Android O中断开的电源事件呢? 顺便说一句。 我有与WIFI断开连接事件相同的问题。 编辑:我很乐意做这个没有来自前台服务的通知

GCMnetworkingpipe理器可以在非Play设备上工作吗?

作为5.0之前的Android JobScheduler的替代品,Google发布了GCMnetworkingpipe理器 ,它自动在Android 5.0中使用本地JobScheduler,并为旧版本自动使用一些自定义代码。 不过,我不确定它是否适用于非Play设备(没有Google Play服务的设备),如Kindle,Blackberry 10和中国手机。 从名字看,它似乎与GCM有关,所以我怀疑它只适用于Play设备。 任何人都可以证实这一点?

Android JobScheduler总是工作1分钟

我试图用新的JobScheduler(由tatarka compat)实现背景清爽的服务。 这是我的服务 @Override public boolean onStartJob(JobParameters params) { Timber.i("on start job: " + params.getJobId()); return true; } @Override public boolean onStopJob(JobParameters params) { Timber.i("on stop job: " + params.getJobId()); return true; } 这是我的JobInfo public void scheduleJob(View v) { JobInfo job = new JobInfo.Builder(kJobId++ /*jobid*/, new ComponentName(getActivity(), RefreshJobService.class)) .setPeriodic(2000) .build(); mTestService.scheduleJob(job); } 在日志中我看到我的工作总是工作1分钟12-31 12:38:03.884 10059-10059/@/RefreshJobService﹕ […]

JobScheduler – 如何确定一个唯一的Job ID?

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