标签: android-jobscheduler

Android jobScheduler不会因jobFinished而停止(params,false)

我想创建一个jobService.这是onStartJob()的样子.

@Override
public boolean onStartJob(JobParameters params) {
    Log.d(TAG, "onStartJob");
    Log.d(TAG, "Params= " + params.getJobId());
    param = params;
    jobFinished(params, false);
    //startAsync();
    return true;
}


@Override
public boolean onStopJob(JobParameters params) {
     Log.d(TAG, "onStopJob");
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这是应该启动这项工作的代码.

public void startJobScheduler(){
    Log.d(TAG, "inside startJobScheduler");
    Activity activity = this.cordova.getActivity();
    Context context = activity.getApplicationContext();


     mJobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE );
     JobInfo.Builder job = new JobInfo.Builder(111, new ComponentName(context, JobSchedulerService.class));

     job.setPeriodic(60000);
     Log.d(TAG, "before mJobScheduler.schedule(job.build())");
     if( mJobScheduler.schedule( job.build() ) <= 0 ) {
         Log.d(TAG, "job schedule failed");
     }
    Log.d(TAG, "333"); …
Run Code Online (Sandbox Code Playgroud)

java service android android-jobscheduler

10
推荐指数
2
解决办法
1万
查看次数

如何使用Instrumentation测试测试JobService?

我有一个JobService正确实现并在简单的情况下工作正常,但我想确保在所有条件下正确测试服务.

我想使用一个Instrumentation测试用例,这样我就可以测试从作业调度getSystemService(JobScheduler.class).schedule(job)onCreatemy JobService和my onStartJob/ onStopJobcalls 调用的全部流程.

我的JobService发布AsyncTask有时候是比较(从而返回trueonStartJob)和其他时间返回false了一个已经完成的工作.我有各种电话jobFinished(mJobParameters, needsReschedule),我想确保它们也能正常工作.

我一直在努力让仪表测试在过去几天工作,但我能够提出的最好的测试是安排工作,但工作从未离开待定状态.我已经尝试了各种等待/后台线程配置,看看是否需要释放UI线程但是没有取得任何成功.

谷歌似乎没有表现出任何正确测试这个组件的全部流程的东西,这是令人惊讶的,因为它们似乎迫使每个人在新的API发布时使用它.

我见过哪些工具可以测试JobScheduler?但是很难自动化adb(我对使用它的答案不感兴趣).

有没有人知道使用Instrumentation测试使用JobScheduler端到端测试JobService的方法?

android android-jobscheduler

9
推荐指数
1
解决办法
1316
查看次数

从JobService观察LiveData

我有一个存储库,用于存放LiveData对象并由两者使用Activity,现在需要JobService(从Firebase调度程序)到ViewModel.

这里有简单的答案Service:从前台服务观察LiveData

但它没有提到如何做同样的事情JobService.

android android-service android-jobscheduler android-livedata android-architecture-components

9
推荐指数
1
解决办法
1540
查看次数

如何使用新请求更新正在运行的JobService?

我有一个应用程序可以选择下载文件.为此,我实现了DownloadService,它将首先进行数据库查询以获取下载候选者,然后构建队列以供下载.一旦构建了队列,它将开始逐个处理下载,直到队列为空,然后自己完成.当服务正在运行时,用户可以添加更多下载请求(将ACTION发送到正在运行的服务以重新构建队列).但是我们不再使用后台服务来定位Oreo或更新版本的Android,我希望避免将其作为前台服务实现,以避免在确定下载队列时显示通知而不进行实际的文件下载.

我试着schedulesetOverrideDeadline(0)使用JobScheduler的API,但是,而不是更新正在运行的作业,旧的被破坏,而新的创造.我也试图enqueue JobWorkItem替代,但onStartJobJobService(其中,我应该出队工作)如果作业已在运行,所以我不能用新的请求更新它不叫.

编辑1:我有一个实验性实现,我将使用此示例代码检查我的JobService是否正在运行

private boolean isServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)){
        if("com.example.MyJobService".equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果作业没有运行,我会安排它,但如果它正在运行,我将使用EventBus向此作业发送事件并使用新请求更新作业.但我更喜欢'纯'JobScheduler的API解决方案.

编辑2:我还可以选择并行下载多个文件并更改排队下载的优先级.

有人知道如何在不创建新JobSchedulerAPI的情况下继续向正在运行的作业发布新请求(操作)吗?(没有第三方图书馆)

api android android-jobscheduler android-8.0-oreo

9
推荐指数
0
解决办法
346
查看次数

JobIntentService 作业 ID 全局唯一或由类限定?

文档暗示它的范围是每个服务类:

用于调度的唯一作业 ID;对于同一个类中排队的所有工作,必须具有相同的值。

但是,我有两个服务与他们的JOB_ID, 和enqueWork()

  companion object {
    private const val JOB_ID = 1

    fun enqueueWork(context: Context, action: String) {
      enqueueWork(context, Svc1::class.java, JOB_ID, Intent(action))
    }
  }
Run Code Online (Sandbox Code Playgroud)

  companion object {
    private const val JOB_ID = 1

    fun enqueueWork(context: Context, action: String) {
      enqueueWork(context, Svc2::class.java, JOB_ID, Intent(action))
    }
  }
Run Code Online (Sandbox Code Playgroud)

当我在启动时启动这两个服务时(可能大约在同一时间)Svc2运行 2倍。将Svc2的 JOB_ID更改为 2 可以解决问题。

如果它不受服务类的限制,那就太糟糕了,因为这意味着每个服务都需要了解同一应用程序中所有其他服务的实现。

?

android android-jobscheduler jobintentservice

9
推荐指数
0
解决办法
306
查看次数

在Android中使用JobScheduler安排作业

我在新的Android API 21中使用JobScheduler的作业计划有问题.这是我用60秒间隔调度作业的代码,如下所示:

ComponentName serviceName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(0, serviceName)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPeriodic(60000)
        .build();
Run Code Online (Sandbox Code Playgroud)

我的JobService只在Logcat中打印运行时,但是日志显示服务在这个时刻运行:

03-18 08:37:26.334: I/JOB(32662): Wed Mar 18 08:37:26 BRT 2015
03-18 08:37:56.364: I/JOB(32662): Wed Mar 18 08:37:56 BRT 2015
03-18 08:39:21.418: I/JOB(32662): Wed Mar 18 08:39:21 BRT 2015
03-18 08:41:51.670: I/JOB(32662): Wed Mar 18 08:41:51 BRT 2015
03-18 08:45:52.192: I/JOB(32662): Wed Mar 18 08:45:52 BRT 2015
03-18 08:54:20.678: I/JOB(32662): Wed Mar 18 08:54:20 BRT 2015
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我用setPeriodic(60000)方法设置它应该在1分钟内执行至少1次.同样好奇的是如何在运行之间增加间隔.此时的时间是2015年3月18日星期三09:09:00 BRT 2015并且工作不会被执行更多.

这是JobScheduler API的问题吗?(我在Android 5.0.1的Nexus 5中运行)

jobs android scheduling task android-jobscheduler

8
推荐指数
2
解决办法
6403
查看次数

GCM Network Manager是否可以在非Play设备上运行?

作为JobScheduler5.0之前的Android 的替代品,谷歌发布了GCM网络管理器,它自动使用Android 5.0中的本机JobScheduler和一些旧版本的自定义代码.

但是,我不确定它是否适用于非Play设备(没有Google Play服务的设备),如Kindle和Blackberry 10以及中国手机.从名称来看,它似乎与GCM有关,所以我怀疑它只适用于Play设备.

谁能证实这一点?

android google-cloud-messaging google-play-services android-jobscheduler

8
推荐指数
1
解决办法
835
查看次数

在Android O中断开广播充电器

现在已经发布了Android O的最终API,并且以下所有广播都没有列入白名单,遇到以下问题:

在我的应用程序(API的目标25)我现在有一个BroadcastReceiver它侦听的系统事件ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED.现在我想更新我的应用程序以定位Android O,但随着此版本的出现,广播行为发生了巨大变化:

针对Android O的应用无法再在其清单中为隐式广播注册广播接收器.隐式广播是一种不专门针对该应用的广播.

由于两个广播都是隐含的,我只能通过该Context.registerReceiver()方法注册它们,但问题就出现了:一旦我的应用程序被系统杀死或系统清除我的应用程序的内存(由于低 -设备的内存)广播注册将丢失.

为了避免这个问题,我可以使用JobSchedulerAPI和setRequiresCharging方法,ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED我必须使用该registerReceiver方法.

由于我的应用程序控制设备的音量(基于这些事件),因此没有错过任何这些事件非常重要.那么我如何才能安全地侦听Android O中断开连接的电源事件?

顺便说一句.我对WIFI断开事件有同样的问题.

编辑:我希望没有来自前台服务的通知我这样做

android android-jobscheduler android-broadcastreceiver android-8.0-oreo

8
推荐指数
1
解决办法
515
查看次数

Android JobScheduler每天只运行一次

我签出了自Android API级别21以来可以使用的JobScheduler API.我想安排一项需要互联网的任务,每天只运行一次或每周运行一次(如果成功执行).我没有找到关于这种情况的例子.有人能帮我吗?谢谢.

android android-jobscheduler

8
推荐指数
1
解决办法
6081
查看次数

计划作业在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 than 100 distinct jobs
       at android.os.Parcel.readException(Parcel.java:1701)
       at android.os.Parcel.readException(Parcel.java:1646)
       at android.app.job.IJobScheduler$Stub$Proxy.schedule(IJobScheduler.java:158)
       at android.app.JobSchedulerImpl.schedule(JobSchedulerImpl.java:42)
       at com.evernote.android.job.v21.JobProxy21.schedule(SourceFile:198)
       at com.evernote.android.job.v21.JobProxy21.plantPeriodic(SourceFile:92)
       at com.evernote.android.job.JobManager.scheduleWithApi(SourceFile:282)
       at com.evernote.android.job.JobManager.schedule(SourceFile:240)
       at com.evernote.android.job.JobRequest.schedule(SourceFile:366) …
Run Code Online (Sandbox Code Playgroud)

android evernote cron-task android-jobscheduler

8
推荐指数
1
解决办法
2347
查看次数