Articles of android 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? 如果是这样,我怎样才能避免这种碰撞?

Android JobScheduler:如果您定期安排同一项工作,是否再次开始这个阶段?

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

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

我使用JobScheduler来安排工作。 主要是将它用于.setRequiredNetworkType()方法,该方法允许您指定仅在build立networking连接(或更具体而言,未计量的连接)时才安排作业。 我正在使用以下非常简单的代码来安排我的工作: 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); 所以在调度中只有一个约束:一个networking连接(可能是“任何”或“不”)。 问题的简短版本 如何从满足所有约束条件中指定最大延迟,并实际运行作业,例如“在存在networking连接的2秒钟内运行作业”? 更长的版本(与ramblings) 问题 我发现,在某些设备上,如果在networking约束已经满足的时期内安排工作,则工作将立即运行(或者足够快以便被用户感知)。 但是,在其他设备上,即使已经有合适的networking连接(以便作业可以立即运行),在实际运行之前仍然存在明显的延迟。 所以,如果这是对用户行为的回应,那么印象就是什么也没有发生,应用程序被破坏了。 现在,我很清楚,这可能是JobScheduler的意图……这是由系统来安排工作,以最好地适应其他要求,并不能保证工作将立即运行约束得到满足。 但是如果需要的话,能够对它进行一些控制是很好的。 因此,对于按计划发生的工作,无需用户参与,让系统完全控制精确时间是好事。 但是,在工作是响应用户操作的地方,我希望工作毫不拖延地运行…假设networking连接在那里。 (如果没有连接,则可以显示一条消息,表示在networking连接恢复时将执行此操作,然后JobScheduler负责确保在networking恢复时运行作业。) setOverrideDeadline()不是一个解决scheme? 我可以看到, JobInfo.Builder确实有一个setOverrideDeadline()方法,这几乎是我想要的。 […]

关于GcmTaskService的一些问题

背景 我想使用在棒棒糖上呈现的新JobScheduler API,但遗憾的是,它没有一个官方端口的前棒棒糖。 但是,有GcmTaskService,它提供了非常相似的function。 问题 这个API是相当新的,所以很less有地方可以find如何使用它的信息(例如这里和这里 )。 问题 我有一些关于这个新的API的问题: 似乎它需要使用Google Play服务( 这里 )(除了使用Android的棒棒糖版本,这将使用正常的JobScheduler)。 如果Google Play服务不可用,我该怎么办? 看来,即使我已经使用“setPersisted(true)”来重复执行任务,当我重新启动设备时,任务将不会再被调用。 怎么来的? 编辑:这是因为我错过了RECEIVE_BOOT_COMPLETED的权限。 什么是一个任务的默认行为,以防我不使用“setRequiredNetwork”? 是“NETWORK_STATE_ANY”吗? 文档说onRunTask返回什么,我可以返回任何值“RESULT_FAILURE”,“RESULT_RESCHEDULE”,“RESULT_SUCCESS”(info here )。 看起来FAILURE和SUCCESS选项都会做同样的事情 – 从队列中移除任务。 这是真的吗? 如果是这样,它们之间的区别究竟是什么? 他们的function不同吗? “ TaskParams ”只用于任务的标签吗? 我可以以某种方式使用API​​将任务传递给任务吗? 否则,我需要设置一个数据库来存储应该传递给任务的数据,对吗? 应用程序是否有可能获得任务队列? 我知道有可能使用adb,但也可以使用API​​吗? 他们说( 这里 )每个任务都有一个3分钟的唤醒锁。 如果任务需要比这更多的话,应该做什么? 它应该为自己获得另一个唤醒锁吗? API会警告唤醒锁被释放了吗? 以下是文档所说的内容: 调度程序将为您的服务保留一个PowerManager.WakeLock,但是如果您的任务没有返回,则在执行三分钟后,将被视为超时,并且唤醒锁将被释放。 重新安排你的任务在这一点上将没有任何效果。 如果你怀疑你的任务运行时间比这个长,你应该明确地启动你自己的服务或者使用其他一些机制。 此API旨在用于相对较快的networking操作。 他们说( 在这里 )每次应用程序升级/更换时,所有的networking任务都会被删除,并且在发生这种情况时会有一个“onInitializeTasks”的调用,并且您可以重新调度它们。 我如何重新安排任务? 我不认为我甚至可以得到任务列表… 是否有可能告诉任务在一天中的特定时间? 例如,在14:00-15:00之间? 我注意到,如果你安排一个任务,然后强制停止和/或清除应用程序的数据,任务仍然会运行。 […]