应用程序被杀死时,Job Scheduler和WorkManager被销毁

时间:2019-03-08 11:09:44

标签: android android-jobscheduler android-workmanager

试图将视频压缩置于后台,但应用WorkManagerJobSchedular被销毁

如何解决此问题?

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    ComponentName componentName = new ComponentName(ConcatVideoActivity.this, ConcatVideoJobServiceRepository.class);
                    JobInfo jobInfo;
                    PersistableBundle bundle = new PersistableBundle();
                    bundle.putString(FIRST_IMG, doctorCredentialModel.getDoctorFrontimg().replaceAll(" ", "%20"));
                    bundle.putString(LAST_IMG, doctorCredentialModel.getDoctorBackimg().replaceAll(" ", "%20"));
                    bundle.putString(VIDEO_URL, doctorCredentialModel.getVidUrl());
                    if(doctorCredentialModel.getDoctorName()!=null){
                        bundle.putString(DR_NAME, doctorCredentialModel.getDoctorName());
                    }else{
                        bundle.putString(DR_NAME,getString(R.string.app_name));
                    }

                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
                        jobInfo = new JobInfo.Builder(12, componentName)
                                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                                .setPersisted(true)
                                .setExtras(bundle)
                                .build();
                    } else {
                        jobInfo = new JobInfo.Builder(12, componentName)
                                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                                .setPersisted(true)
                                .setExtras(bundle)
                                .build();
                    }
                    try {
                        JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
                        int resultCode = jobScheduler.schedule(jobInfo);
                        if (resultCode == JobScheduler.RESULT_SUCCESS) {
                            Log.d("JOB SECHEDULED", "Job scheduled!");

                        } else {
                            Log.d("JOB NOT SECHEDULED", "Job not scheduled");
                        }


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }




@Override
public boolean onStartJob(JobParameters jobParameters) {
    Log.d(TAG, "Job started!");

    firstImg = jobParameters.getExtras().getString(FIRST_IMG);
    secondImg = jobParameters.getExtras().getString(LAST_IMG);
    videoUrl = jobParameters.getExtras().getString(VIDEO_URL);
    drName = jobParameters.getExtras().getString(DR_NAME);
    loadFFMpegBinary(jobParameters);
    isWorking = true;
    // We need 'jobParameters' so we can call 'jobFinished'
   // startConcatVideo(jobParameters); // Services do NOT run on a separate thread
    Toast.makeText(this, "Video Customization InProgress ", Toast.LENGTH_SHORT).show();
    return isWorking;
}

1 个答案:

答案 0 :(得分:0)

WorkManager在API Level 23+上运行时使用JobScheduler,对于较旧的OS版本,它结合使用AlarmManager和BroadcastReceivers。 API级别21-22上的JobScheduler在某些设备上存在一些实现问题,这就是WorkManager开始仅在棉花糖上使用JobScheduler的原因。

因此,对于API级别23 +,WorkManager和JobScheduler的行为相同。使用WorkManager的好处是,大多数功能从API级别14开始可用。

关于您的问题,您没有指定在哪个设备上看到此问题。您是否尝试过在带有模拟器图像的模拟器上运行示例,以查看问题是否仍然存在?

可能会影响您的后台工作的另一件事是JobScheduler(和WorkManager)对后台工作施加的10分钟限制。 10分钟后,您的工作停止了。

一些设备制造商已决定修改库存Android,以强制停止该应用。这就是WorkManager停止工作的原因(JobScheduler,警报,广播接收器等也将停止工作)。没有办法解决此问题。不幸的是,某些设备制造商会这样做,因此在这种情况下,WorkManager将停止工作,直到下次启动该应用程序为止。

这是在WorkManager's issuetracker上报告的。