试图将视频压缩放在后台,但应用程序被杀死WorkManager
和JobSchedular
被摧毁
怎么解决这个问题?
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;
}
在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上报道的。