在onStartJob

时间:2019-04-07 09:14:32

标签: android broadcastreceiver firebase-job-dispatcher jobservice

我使用FirebaseJobDispatcherJobService在后​​台做一些工作。我主要想注册到屏幕开/关接收器。首次调用该作业时,将按预期方式注册接收者。 但是,在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");
  }

1 个答案:

答案 0 :(得分:1)

我的问题是我在检查screenBroadcast是否为onStartJob()后忘记初始化null中的false。另外,我在onStartJob()中返回了true,而不是 if ( file_exists(base_path().'/App/'.$request->program_type.'.php')) { $formRequest = 'App\Http\Requests\\'.$request>program_type.'FormRequest'; $validated = $formRequest::validate($request); } }

来自Docs

  

通过此方法返回false表示您的工作已经完成。   系统的作业唤醒锁将被释放,并且   onStopJob(android.app.job.JobParameters)将不会被调用。

并且:

  

如果您的作业需要继续运行,请从此方法返回true。如果   您执行此操作,该作业将保持活动状态,直到您致电   jobFinished(android.app.job.JobParameters,boolean)告诉系统   它已经完成工作,或直到需要工作为止   约束不再满足。

在我的情况下,由于我需要广播接收器处于活动状态,因此我需要返回true,以便不会调用onDestroy并且接收器也不会注销。