Articles of android jobscheduler

Android N:处理缺少CONNECTIVITY_CHANGE

我的AppWidgetProvider (当然是BroadcastReceiver )被注册为接收CONNECTIVITY_CHANGE ,因此我可以在网络恢复后立即更新小部件(尽管只在需要时,即如果由于缺乏连接而错过了先前的更新)。 但正如此处所述 ,这在Android N中将不再可能。建议使用JobScheduler ,它允许您指定Job只有在通过.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)连接到网络时才能运行方法。 但是,我无法看到如何使用它来复制我想要的行为。 在我看来,如果在安排作业时没有网络, .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)方法将导致作业根本不运行 ,并且它不会导致作业耐心等待,直到有一个网络,然后运行(这是我需要的)。 那么,如何使用Android N保留我需要的行为?

JobScheduler Android Oreo问题

在我当前的公司申请中,我有一个ForegroundService,在工作人员值class时运行(登录到应用程序)。 在用户登录时保持前台服务正常运行非常重要。要从这种前台服务以某种方式被杀死的情况中恢复(用户任务轻扫或系统杀死)已经实现了一个带有Jobscheduler的定期JOB,它会重新激活ForegroundService以防万一关掉。 此技术在Android 8 OREO之前运行良好。 START_STICKY和其他技术本身并不适合我。 在Android 8中,一旦前台服务被杀死,定期作业也会被杀死。 我在logcat中收到通知,不允许该作业运行。 根据我的理解,即使应用程序处于后台或被杀,乔布斯也能够运行。 它以前所未有的方式开发OREO设备。 据我所知,我可以通过在应用程序设置中启用“自动启动”选项来解决这个问题。 但是,由于没有办法知道员工是否认可,这也不是一件可靠的事情。 所以我的问题是: – 为什么Job Scheduler在Android 8中停止工作? – 我可以使用任何其他可靠的技术让我的ForegroundService从ANDROID OREO中关闭恢复吗? 我已阅读https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c,但没有回答我的问题 非常感谢你

一直运行jobscheduler(打瞌睡或不打瞌睡)

如何在打盹或非打盹模式下运行jobscheduler,即我想一直运行bg作业。 可能吗? JobInfo jobInfo = new JobInfo.Builder(MYJOBID, jobService).setPeriodic(15 * 60 * 1000L) .setExtras(bundle) .setPersisted(true) .build();

Android Job Scheduler – 安排Job立即执行一次

我正在尝试使用android作业调度程序来安排作业立即执行一次。 JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.cancel(1); PersistableBundle bundle = new PersistableBundle(); bundle.putInt(JobFlags.KEY_PERIODIC_SYNC_JOB, JobFlags.JOB_TYPE_INITIAL_FETCH); jobScheduler.schedule(new JobInfo.Builder(1, new ComponentName(context, SyncJobLollipop.class)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setExtras(bundle) .setMinimumLatency(10) .setOverrideDeadline(24 * 3600 * 1000) .build()); 但它运行了大约3 4次。 这有什么不对? 这是工作类本身: @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class SyncJobLollipop extends JobService implements JobFinishedListener { @Inject SyncJobBackend jobBackend; private JobParameters jobParameters; @Override public boolean onStartJob(JobParameters jobParameters) { […]

GCM网络管理员 – 周期性任务未触发

我正在尝试使用GcmNetworkManager在我的应用程序中安排定期任务,该任务运行到API级别17.我按照GCM网络管理器页面( https://developers.google.com/上的说明)设置了所有内容。 云消息/网络管理员 ): 在我的AndroidManifest.xml中,我有: 在我的申请中,我有: long periodSecs = 30L; // the task should be executed every 30 seconds long flexSecs = 15L; // the task can run as early as -15 seconds from the scheduled time String tag = “myScan|1”; PeriodicTask periodic = new PeriodicTask.Builder() .setService(MyService.class) .setPeriod(periodSecs) .setFlex(flexSecs) .setTag(tag) .setPersisted(false) .setRequiredNetwork(com.google.android.gms.gcm.Task.NETWORK_STATE_ANY) .setRequiresCharging(false) .setUpdateCurrent(true) .build(); […]

计划作业在Evernote- AndroidJob中执行多次

我有一个我想要运行的定期工作,它是在Evernote的Android Job库的帮助下实现的。 我希望实现的是将myMyLocation更新为15分钟。 问题是,每隔15分钟,这项工作似乎要多次执行。 我使用OnePlus3设备测试并通过调试,我观察到LocationUpdateJob.schedule()只被调用一次,这是正确的,但是LocationUpdateJob.onRunJob()被多次调用,这是不正确的,但应该只调用一次每15分钟一次。 此外,根据崩溃分析,一些设备会抛出illegalStateExceptions。 此特殊例外仅在Android 7设备上发生。 这是崩溃报告中的崩溃: Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.myapp/MainActivity}: java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2947) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6688) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) Caused by java.lang.IllegalStateException: Apps may not schedule more […]

Job Scheduler未在设定的时间间隔内运行

我正在尝试使用android Job Scheduler API,而我所要做的就是让Job Scheduler每5秒运行一次。 但是当我运行它时,相应的服务每两分钟就会命中一次。 我有一个日志记录每次服务时都会记录。 我不确定为什么会这样。 Job Scheduler是否具有最小间隔时间。 我的代码很简单…… JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(this, UpdateDatabaseService.class)) .setPeriodic(5000) .build(); JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(jobInfo); 这个问题最初是在我尝试运行日常任务时产生的,但它会在当天多次触发服务,并且不遵循时间准则。 让我知道你的想法。

Android Oreo在进入打盹模式后查杀后台服务并清除待处理警报,预定作业

我的应用程序运行后台service ,可以获取用户当前location并每五分钟将其更新到服务器。 要连续运行此location更新过程,我使用警报管理器从service本身设置其下一个执行时间。 但是,当我在运行Android 8.1 Nokia 6安装应用程序时,它可以运行一段时间,如果我将手机闲置一段时间,我的service将被应用程序的下一个警报杀死,同时也会从系统alarm manager清除。 我的猜测是空闲时间使手机进入doze mode 。 但是,我不明白警报管理员为何被清除。 根据我的理解, doze mode应定期打开维护窗口以执行任何待处理的任务。 为了缓解这个问题,我尝试在JobScheduler之上应用JobScheduler service ,每隔15分钟运行一次。 这个jobscheduler目的是重新启动具有alarmmanager的service ,因此即使它被杀死并且警报被清除, jobscheduler也会重新启动service 。 在我测试了这个补丁并保持一段时间进入idle mode ,它导致获得JobScheduler Service和Service ,其中的警报被预定的作业和警报从系统中清除。 据Android文档说,我们可以使用JobScheduler来减轻其后台执行限制。 为了测试这一点,我在测试应用程序时强制杀死了这两个services ,但是已经安排的工作没有被清除,并且它使警报service再次成功运行。 我不明白这种行为的原因,虽然Evernote的人给出的解释可以在这里安排这个场景Android Job by Evernote 对这种exception行为的任何想法? 测试环境细节 设备: Nokia 6 (TA-1021) 操作系统: Android 8.1.0

在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断开连接事件的相同问题。 编辑:我希望没有来自前台服务的通知我这样做

如何使用Instrumentation测试测试JobService?

我有一个正确实现的JobService ,在简单的情况下工作正常,但我想确保在所有条件下正确测试服务。 我想使用Instrumentation测试用例,以便我可以使用getSystemService(JobScheduler.class).schedule(job)测试作业调度的完整流程,以及在我的JobService和onStartJob / onStopJob调用中调用onCreate 。 我的JobService有时会启动AsyncTask (因此在onStartJob返回true ),有时它会为已经完成的工作返回false 。 我有各种各样的jobFinished(mJobParameters, needsReschedule)调用jobFinished(mJobParameters, needsReschedule) ,我想确保它们也能正常工作。 我一直在努力让仪表测试工作在过去几天,但我能够提出的最好的是一项测试,安排工作,但工作永远不会离开待定状态。 我已经尝试了各种等待/后台线程配置,看看是否需要释放UI线程但是没有取得任何成功。 谷歌似乎没有表现出任何正确测试这个组件的完整流程的东西,这是令人惊讶的,因为它们似乎迫使每个人在新的API发布时使用它。 我见过哪些工具可以测试JobScheduler? 但是使用adb很难实现自动化(我对使用它的答案不感兴趣)。 有没有人知道使用Instrumentation测试使用JobScheduler端到端测试JobService的方法?