首页 > 解决方案 > 在 onStartJob 中注册后广播接收器不起作用

问题描述

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

标签: androidbroadcastreceiverfirebase-job-dispatcherjobservice

解决方案


我的问题是我screenBroadcastonStartJob()检查它是否为null. 我也回来false了,onStartJob()而不是true

文档

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

和:

如果您的作业需要继续运行,则从此方法返回 true。如果您这样做,作业将保持活动状态,直到您调用 jobFinished(android.app.job.JobParameters, boolean) 来告诉系统它已完成其工作,或者直到作业的所需约束不再满足。

就我而言,由于我需要广播接收器处于活动状态,因此我需要返回 true 以便不会调用 onDestroy 并且接收器不会取消注册。


推荐阅读