JobIntentService - получить все запущенные вакансии
Я использую JobIntentService. У меня есть следующий вариант использования, и мне нужна помощь, как я могу его реализовать.
вариант использования:
У меня есть один сервис, отвечающий за загрузку. Теперь, если пользователь нажимает на кнопку загрузки для определенного контента, эта служба запускается и onHandleWork
называется, где я загружаю контент синхронно.
Теперь мне нужен способ прервать и / или связаться с этой задачей загрузки. Скажем, например, есть 5 содержимого и пользователь нажимает на кнопку загрузки в следующей последовательности A, B, C, X, D, E
и скажем, что контент X очень важен (высокий приоритет) и должен быть загружен первым. Также мне нужно показать уведомление для каждого контента, как только пользователь нажмет на кнопку загрузки.
Так что согласно реализации по умолчанию - onHandleWork()
для контента А будет вызываться в первую очередь и только тогда, когда он завершил загрузку, то onHandleWork()
за б будет называться и тд.
Я хочу, чтобы, когда пользователь нажимал кнопку загрузки контента X: предположим, что в это время загружался контент B, тогда, поскольку контент X имеет высокий приоритет, загрузка контента B, C будет остановлена, а затем X будет загружен, и как только его закончить, тогда мы можем перейти к D, E, B, C.
Теперь с IntentService
Я мог бы сделать это, потому что onStartCommand()
был назван, и это не статично. Моя логика была примерно такой:
Но сейчас onStartCommand()
не вызывается для устройства oreo +. Так что я могу сделать? Я не могу сделать DownloadTaskService как синглтон.
public class DownloadTaskServiceC extends JobIntentService {
static final int JOB_ID = 1100;
private Map<String, DownloadModel> downloadQueue;
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, DownloadTaskServiceC.class, JOB_ID, work);
}
private void iterateThroughMyDownloadQueueAndPause(){
for(DownloadModel model : downloadQueue){
model.status("pause");
}
}
/**
* need similar method for JobIntentService
*/
//@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
LogUtil.d(TAG, "onStartCommand called");
if(isHighPriorityContent()){
iterateThroughMyDownloadQueueAndPause();
}
downloadQueue.add(currentJobId, model);
return START_REDELIVER_INTENT;
}
@Override
protected void onHandleWork(@NonNull Intent intent){
String currentJobId = getJobIdFromIntent();
DownloadModel model = getModelFromIntent();
if("pause".equals(model.getStatus())){
model.setStatus("incomplete");
//do nothing let onHandleIntent() complete
}else {
//continueDownload
}
checkDownloadQueueAndRestartIncompleteDownload();
}
}