使用Job Scheduler处理连续事件

时间:2019-06-23 19:48:26

标签: android broadcastreceiver android-7.0-nougat android-jobscheduler

“我的应用”必须意识到使用用户设备上的任何相机应用拍照的过程,并在该照片上有所进展。
在API <24上,我使用了广播接收器,可以捕获com.android.camera.NEW_PICTURE个事件,并且工作正常。
但是根据this文档以实现API> = 24中的目标,我们必须改为使用Job-Scheduler
我使用了这段代码,它在一次作业执行时间内就可以很好地处理一张图片。但是当我连续拍摄照片时,工作计划程序只会处理第一个。

@TargetApi(Build.VERSION_CODES.N)
public class CameraJobService extends JobService
{
private static final String TAG = "CameraJobService";

@Override
public boolean onStartJob(final JobParameters params)
{
    Log.i(TAG, "onStartJob: " + this);

    // do in background thread
    new Thread(() -> {
        doJob(params);

        // mark the job as 'finished'
        jobFinished(params, false);

        // create a new job
        prepareJob(getApplicationContext());
    }).start();

    // mark the job as 'on processing'
    return true;
}

@Override
public boolean onStopJob(JobParameters params)
{
    Log.i(TAG, "onStopJob: " + this);
    // reschedule job if it was terminated by os
    return true;
}

private void doJob(JobParameters params)
{
    if (params.getTriggeredContentAuthorities() != null && params.getTriggeredContentUris() != null)
    {
        //some job here
        Log.d(TAG, "doJob: ");
    }
}

@TargetApi(Build.VERSION_CODES.N)
public static void prepareJob(Context context)
{
    Log.i(TAG, "prepareJob");
    JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    JobInfo.Builder builder = new JobInfo.Builder(1001,
            new ComponentName(context, CameraJobService.class));

    builder.addTriggerContentUri(
            new JobInfo.TriggerContentUri(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));

    if (scheduler != null)
    {
        scheduler.schedule(builder.build());
    }
}
}

我在JobService中初始化了BroadcastReceiverMainActivity

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    //
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // use job scheduler
        CameraJobService.prepareJob(this);
    } else {
        // use broadcast receiver
        CameraBroadcastReceiver.register(this);
    }
}

我认为发生此问题是因为一项工作现在正在进行中,而我们不能在当前工作完成之前开始新的工作。但是有什么办法可以解决这个问题?

0 个答案:

没有答案