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()方法,这几乎是我想要的。 […]

Job Scheduler不在Android N上运行

Job Scheduler在Android Marshmallow和棒棒糖设备上按预期工作,但不运行Nexus 5x(Android N Preview)。 调度工作的代码 ComponentName componentName = new ComponentName(MainActivity.this, TestJobService.class.getName()); JobInfo.Builder builder; builder = new JobInfo.Builder(JOB_ID, componentName); builder.setPeriodic(5000); JobInfo jobInfo; jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobInfo = builder.build(); int jobId = jobScheduler.schedule(jobInfo); 服务在清单中定义为: <service android:name=".TestJobService" android:permission="android.permission.BIND_JOB_SERVICE" /> Android N(预览版)上有这个问题吗?