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 версии
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. Перейдите по этой ссылке, чтобы проверить, как это может быть достигнуто