Я использую FirebaseJobDispatcher
и JobService
, чтобы немного поработать над фоном. В основном я хочу зарегистрировать экран включения / выключения приемника. Когда задание вызывается в первый раз, получатель регистрируется, как и предполагалось.
Однако сразу после onStartJob()
вызывается onDestroy()
и по логам получатель нулевой. Если я пытаюсь включить или выключить экран, я не вижу никаких журналов от приемника. Что я здесь делаю неправильно?
В onStratJob()
у меня есть следующий код:
public boolean onStartJob(@NonNull JobParameters job) {
Log.i(JobFormActivity.TAG, "onStartJob() called");
if (screenBroadcast == null){
Log.e(JobFormActivity.TAG, "onStartJob() --> receiver is null, registering receiver");
IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenBroadcast, screenStateFilter);
}
return false;
}
В onStopJob()
у меня есть следующий код:
@Override
public boolean onStopJob(@NonNull JobParameters job) {
Log.e(JobFormActivity.TAG, "onStopJob() called");
if (screenBroadcast != null) {
Log.e(JobFormActivity.TAG, "onStopJob() --> receiver is not null, unregistering receiver");
unregisterReceiver(screenBroadcast);
}
return false;
}
В onDestroy()
у меня есть следующий код:
public void onDestroy() {
super.onDestroy();
Log.e(JobFormActivity.TAG, "onDestory()");
if (screenBroadcast != null)
Log.e(JobFormActivity.TAG, "onDestroy() --> receiver is not null");
else
Log.e(JobFormActivity.TAG, "onDestory() --> receiver is null");
}
Моя проблема заключалась в том, что я забыл инициализировать screenBroadcast
в onStartJob()
после проверки, если это null
. Также я возвращал false
в onStartJob()
вместо true
.
Из Документы:
Returning false from this method means your job is already finished. The system's wakelock for the job will be released, and onStopJob(android.app.job.JobParameters) will not be invoked.
А также:
Return true from this method if your job needs to continue running. If you do this, the job remains active until you call jobFinished(android.app.job.JobParameters, boolean) to tell the system that it has completed its work, or until the job's required constraints are no longer satisfied.
В моем случае, поскольку мне нужно было, чтобы широковещательные приемники были живы, мне нужно было вернуть true, чтобы onDestroy не вызывался и приемники не отменяли регистрацию.
Вы не видите этот журнал
onStartJob() --> receiver is null, registering receiver
после вызоваonStartJob
? Если да, можете ли вы поделиться полным кодомFirebaseJobDispatcher
илиJobService
.