我使用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");
}
我的问题是在检查它是否null
后,我忘记在onStartJob()
中初始化screenBroadcast
。我也在onStartJob()
false
回来,而不是true
。
从文档:
从此方法返回 false 意味着您的作业已完成。 将释放作业的系统唤醒锁,并且 onStopJob(android.app.job.JobParameters( 不会被调用。
和:
如果作业需要继续运行,则从此方法返回 true。如果 执行此操作,作业将保持活动状态,直到您调用 jobDone(android.app.job.JobParameters, boolean( 告诉系统 它已完成其工作,或直到工作需要为止 不再满足约束。
就我而言,由于我需要广播接收器处于活动状态,因此我需要返回 true,以便不会调用 onDestroy 并且接收器不会取消注册。