onStartJob и onStopJob не работают в Android для запуска фонового потока

На самом деле я хочу использовать JobScheduler для уведомлений, даже если приложение активно или нет. Я новичок в Android сначала просто пытаюсь запустить фон AsyncTask, чтобы проверить, работает ли он нормально, но не работает.

Вот мой код JobService:

public class JobSchedularClass extends JobService {
    private static final String TAG = "JobSchedularClass";

   private BackgroundJob backgroundJob;
    @Override
    public boolean onStartJob(final JobParameters params) {

        Log.d(TAG, "onStartJob: ");

         backgroundJob=new BackgroundJob(){
            @Override
            protected void onPostExecute(String s) {
                Toast.makeText(getApplicationContext(),s+"kjk",Toast.LENGTH_SHORT).show();
                jobFinished(params,false);

            }
        };

        backgroundJob.execute();
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d(TAG, "onStopJob: ");
        backgroundJob.cancel(true);
        return false;
    }
}

Класс AsyncTask:

public class BackgroundJob extends AsyncTask<Void,Void,String> {
    private static final String TAG = "BackgroundJob";
    @Override
    protected String doInBackground(Void... voids) {
        Log.d(TAG, "doInBackground: ");
        return "BackGround Job is running";
    }
}

Основной код деятельности:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ComponentName componentName=new ComponentName(MainActivity.this,JobSchedularClass.class);
         jobInfo =new JobInfo.Builder(code,componentName)
        .setPeriodic(5000)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPersisted(true)
         .build();
      jobScheduler=(JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);

    }

    public void Startjob(View view) {
       int code_result= jobScheduler.schedule(jobInfo);
        Toast.makeText(this," Job scheduling...",Toast.LENGTH_SHORT).show();
       if(code_result==JobScheduler.RESULT_SUCCESS){
           Toast.makeText(this," Job scheduling done...",Toast.LENGTH_SHORT).show();
       }
       else{
           Toast.makeText(this," Job scheduling  failed...",Toast.LENGTH_SHORT).show();
       }

    }

    public void Stopjob(View view) {

        jobScheduler.cancel(code);
        Toast.makeText(this," Job cancel...",Toast.LENGTH_SHORT).show();
    }

Вот Манифест Разрешения и Сервис Зарегистрированный код:

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <service android:name=".JobSchedularClass"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"
      />

Примечание. Я использую API 21 в соответствии с требованиями. Пожалуйста, направьте меня туда, где я делаю ошибку. Заранее спасибо

1 ответ

Решение

Были некоторые проблемы с setPeriodic() на Android версии setMinimuLatency() чтобы он работал на всех версиях

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
        jobInfo = new JobInfo.Builder(id, name)
                .setMinimumLatency(5000)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setPersisted(true)
                .build();
    } else {
        jobInfo = new JobInfo.Builder(id, name)
                .setPeriodic(5000)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setPersisted(true)
                .build();
   }

работает нормально, но время занимает больше 5 секунд, чтобы выполнить снова

На основе документации для setMinimumLatency ():

Миллисекунды, до которых эта работа не будет рассматриваться для выполнения

Основываясь на документации для setPeriodic ():

Вы не можете контролировать, когда в течение этого интервала будет выполнено это задание, только гарантия того, что оно будет выполнено не более одного раза в течение этого интервала.

В целом, вы не можете контролировать, когда запланированное задание будет выполнено. Система решит, когда ее выполнить.

В моем коде я хочу проверять и отправлять уведомление FCM через каждые 5 минут, даже если приложение активно или нет

Это не очень хорошая идея, чтобы сделать это. Вы никогда не можете гарантировать, что успешно выполните задание даже через 5 минут, когда включится режим ожидания.

Хотя есть альтернативы, такие как создание службы переднего плана или запуск AlarmManager каждые 5 минут, но эти подходы разряжают батарею.

Вместо этого вы можете уменьшить частоту уведомления вашего сервера. Скажем, каждые 2 часа или два раза в день. Но с помощью JobScheduler вы не сможете точно определить точное время. Если ваше требование - точное время, перейдите к AlarmManager. Перейдите по этой ссылке, чтобы проверить, как это может быть достигнуто

Другие вопросы по тегам