Как поставить в очередь jobworkitem с помощью jobscheduler

#java #android #android-intent #android-activity #mobile

#java #Android #android-намерение #android-активность #Мобильный

Вопрос:

В Интернете почти нет примеров для JobWorkItem в Android.

Пытаюсь добавить работу к заданию (используя JobScheduler framework) в Android. Но мое намерение JobWorkItem никогда не выполняется. Пытаюсь использовать этот метод для конкретизации. Я заметил, что точка останова в моем сервисе (JsonDownloadIntentService) никогда не достигается.

 MainActivity.java

private void startJobService() {
        JobScheduler jobScheduler = (JobScheduler) getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobScheduler.schedule(getJobInfo());
    }

    private JobInfo getJobInfo() {
        if(jobInfo == null) {
           jobInfo =  (new JobInfo.Builder(10, new ComponentName(getApplicationContext().getPackageName(), EmptyJobService.class.getName()))).setMinimumLatency(0).setOverrideDeadline(5000).build();
        }
        return jobInfo;
    }

    private void enqueueWorkItem() {
        Intent startJsonDownloadService = new Intent(this, JsonDownloadIntentService.class);
        ((JobScheduler)getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE)).enqueue(getJobInfo(), new JobWorkItem(startJsonDownloadService));
    }
  

EmptyJobService.java

         public class EmptyJobService extends JobService {
        @Override
        public boolean onStartJob(JobParameters params) {
            Log.d(Constants.JOB_SERVICE, "Job Service started");
            Toast.makeText(getApplicationContext(), "", Toast.LENGTH_SHORT).show();
            return false;
        }

        @Override
        public boolean onStopJob(JobParameters params) {
            Log.d(Constants.JOB_SERVICE, "Job service stopped");
            return false;
        }
}
  

AndroidManifest.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.viewer.myphotoviewer">
    <uses-permission android:name="android.permission.INTERNET" />
   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">


        <activity android:name=".PhotoGalleryActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".ImageDownloadIntentService" />
        <service android:name=".JsonDownloadIntentService" />
        <service android:name=".EmptyJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"
            />

        <activity android:name=".ImageViewActivity"></activity>
    </application>
</manifest>
  

Ответ №1:

объявлено ли это в манифесте вместе с разрешением?

 <service
android:name=".MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
  

Комментарии:

1. Спасибо за ответ. Да, служба заданий запущена, это намерение jobworkitem, которое не выполняется. Я мог узнать это из журналов: com.viewer.myphotoviewer D / job_service: служба заданий запущена

Ответ №2:

Когда вы возвращаете false из onStartJob(), это означает, что вы сообщаете системе, что, как только этот метод вернет мою работу, она будет выполнена. Итак, Android framework запускает onJobFinished() от вашего имени. Но когда вы возвращаете true , это означает, что ваша работа должна выполняться после этого обратного вызова, и вы получаете ответственность за вызов onJobFinished по завершении работы.

Вам нужно использовать dequeue() полученных параметров задания и получить ваш workitem, который был поставлен в очередь. Как только ваша работа будет выполнена, вызовите completeWork (WorkItem). После того, как вся работа обработана, вызовите dequeue наконец, чтобы система завершила вашу службу заданий, вызвав jobFinished() от вашего имени.

Пожалуйста, прочтите эту статью, которую я написал, объясняющую API JobWorkItem вместе с рабочим примером для JobWorkItem.

https://medium.com/@kiitvishal89/jobworkitem-jobschedulers-way-of-splitting-your-job-d6d5385390b