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

问题描述 投票:0回答:1

试图将视频压缩放在后台,但应用程序被杀死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;
}
android android-jobscheduler android-workmanager
1个回答
0
投票

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

因此,对于API Level 23+,WorkManager和JobScheduler的行为方式相同。使用WorkManager的优势在于,从API Level 14开始,大多数功能都可用。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.