Skip to content

Most visited

Recently visited

navigation

JobParameters

public class JobParameters
extends Object implements Parcelable

java.lang.Object
   ↳ android.app.job.JobParameters


Contains the parameters used to configure/identify your job. You do not create this object yourself, instead it is handed in to your application by the System.

Summary

Inherited constants

From interface android.os.Parcelable

Fields

public static final Creator<JobParameters> CREATOR

Public methods

void completeWork(JobWorkItem work)

Report the completion of executing a JobWorkItem previously returned by dequeueWork().

JobWorkItem dequeueWork()

Dequeue the next pending JobWorkItem from these JobParameters associated with their currently running job.

int describeContents()

Describe the kinds of special objects contained in this Parcelable instance's marshaled representation.

ClipData getClipData()
int getClipGrantFlags()
PersistableBundle getExtras()
int getJobId()
Bundle getTransientExtras()
String[] getTriggeredContentAuthorities()

For jobs with addTriggerContentUri(JobInfo.TriggerContentUri) set, this reports which content authorities have triggered the job.

Uri[] getTriggeredContentUris()

For jobs with addTriggerContentUri(JobInfo.TriggerContentUri) set, this reports which URIs have triggered the job.

boolean isOverrideDeadlineExpired()

For jobs with setOverrideDeadline(long) set, this provides an easy way to tell whether the job is being executed due to the deadline expiring.

void writeToParcel(Parcel dest, int flags)

Flatten this object in to a Parcel.

Inherited methods

From class java.lang.Object
From interface android.os.Parcelable

Fields

CREATOR

added in API level 21
Creator<JobParameters> CREATOR

Public methods

completeWork

added in API level 26
void completeWork (JobWorkItem work)

Report the completion of executing a JobWorkItem previously returned by dequeueWork(). This tells the system you are done with the work associated with that item, so it will not be returned again. Note that if this is the last work in the queue, completing it here will not finish the overall job -- for that to happen, you still need to call dequeueWork() again.

If you are enqueueing work into a job, you must call this method for each piece of work you process. Do not call jobFinished(JobParameters, boolean) or else you can lose work in your queue.

Parameters
work JobWorkItem: The work you have completed processing, as previously returned by dequeueWork()

This value must never be null.

dequeueWork

added in API level 26
JobWorkItem dequeueWork ()

Dequeue the next pending JobWorkItem from these JobParameters associated with their currently running job. Calling this method when there is no more work available and all previously dequeued work has been completed will result in the system taking care of stopping the job for you -- you should not call jobFinished(JobParameters, boolean) yourself (otherwise you risk losing an upcoming JobWorkItem that is being enqueued at the same time).

Once you are done with the JobWorkItem returned by this method, you must call completeWork(JobWorkItem) with it to inform the system that you are done executing the work. The job will not be finished until all dequeued work has been completed. You do not, however, have to complete each returned work item before deqeueing the next one -- you can use dequeueWork() multiple times before completing previous work if you want to process work in parallel, and you can complete the work in whatever order you want.

If the job runs to the end of its available time period before all work has been completed, it will stop as normal. You should return true from onStopJob(JobParameters) in order to have the job rescheduled, and by doing so any pending as well as remaining uncompleted work will be re-queued for the next time the job runs.

This example shows how to construct a JobService that will serially dequeue and process work that is available for it:

public class JobWorkService extends JobService {
    private NotificationManager mNM;
    private CommandProcessor mCurProcessor;

    /**
     * This is a task to dequeue and process work in the background.
     */
    final class CommandProcessor extends AsyncTask<Void, Void, Void> {
        private final JobParameters mParams;

        CommandProcessor(JobParameters params) {
            mParams = params;
        }

        @Override
        protected Void doInBackground(Void... params) {
            boolean cancelled;
            JobWorkItem work;

            /**
             * Iterate over available work.  Once dequeueWork() returns null, the
             * job's work queue is empty and the job has stopped, so we can let this
             * async task complete.
             */
            while (!(cancelled=isCancelled()) && (work=mParams.dequeueWork()) != null) {
                String txt = work.getIntent().getStringExtra("name");
                Log.i("JobWorkService", "Processing work: " + work + ", msg: " + txt);
                showNotification(txt);

                // Process work here...  we'll pretend by sleeping.
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                }

                hideNotification();

                // Tell system we have finished processing the work.
                Log.i("JobWorkService", "Done with: " + work);
                mParams.completeWork(work);
            }

            if (cancelled) {
                Log.i("JobWorkService", "CANCELLED!");
            }

            return null;
        }
    }

    @Override
    public void onCreate() {
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        Toast.makeText(this, R.string.service_created, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy() {
        hideNotification();
        Toast.makeText(this, R.string.service_destroyed, Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        // Start task to pull work out of the queue and process it.
        mCurProcessor = new CommandProcessor(params);
        mCurProcessor.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

        // Allow the job to continue running while we process work.
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        // Have the processor cancel its current work.
        mCurProcessor.cancel(true);

        // Tell the system to reschedule the job -- the only reason we would be here is
        // because the job needs to stop for some reason before it has completed all of
        // its work, so we would like it to remain to finish that work in the future.
        return true;
    }

    /**
     * Show a notification while this service is running.
     */
    private void showNotification(String text) {
        // The PendingIntent to launch our activity if the user selects this notification
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, JobWorkServiceActivity.class), 0);

        // Set the info for the views that show in the notification panel.
        Notification.Builder noteBuilder = new Notification.Builder(this)
                .setSmallIcon(R.drawable.stat_sample)  // the status icon
                .setTicker(text)  // the status text
                .setWhen(System.currentTimeMillis())  // the time stamp
                .setContentTitle(getText(R.string.service_start_arguments_label))  // the label
                .setContentText(text)  // the contents of the entry
                .setContentIntent(contentIntent);  // The intent to send when the entry is clicked

        // We show this for as long as our service is processing a command.
        noteBuilder.setOngoing(true);

        // Send the notification.
        // We use a string id because it is a unique number.  We use it later to cancel.
        mNM.notify(R.string.job_service_created, noteBuilder.build());
    }

    private void hideNotification() {
        mNM.cancel(R.string.service_created);
    }
}

Returns
JobWorkItem Returns a new JobWorkItem if there is one pending, otherwise null. If null is returned, the system will also stop the job if all work has also been completed. (This means that for correct operation, you must always call dequeueWork() after you have completed other work, to check either for more work or allow the system to stop the job.)

describeContents

added in API level 21
int describeContents ()

Describe the kinds of special objects contained in this Parcelable instance's marshaled representation. For example, if the object will include a file descriptor in the output of writeToParcel(Parcel, int), the return value of this method must include the CONTENTS_FILE_DESCRIPTOR bit.

Returns
int a bitmask indicating the set of special object types marshaled by this Parcelable object instance.

getClipData

added in API level 26
ClipData getClipData ()

Returns
ClipData The clip you passed in when constructing this job with setClipData(ClipData, int). Will be null if it was not set.

getClipGrantFlags

added in API level 26
int getClipGrantFlags ()

Returns
int The clip grant flags you passed in when constructing this job with setClipData(ClipData, int). Will be 0 if it was not set.

getExtras

added in API level 21
PersistableBundle getExtras ()

Returns
PersistableBundle The extras you passed in when constructing this job with setExtras(android.os.PersistableBundle). This will never be null. If you did not set any extras this will be an empty bundle.

getJobId

added in API level 21
int getJobId ()

Returns
int The unique id of this job, specified at creation time.

getTransientExtras

added in API level 26
Bundle getTransientExtras ()

Returns
Bundle The transient extras you passed in when constructing this job with setTransientExtras(android.os.Bundle). This will never be null. If you did not set any extras this will be an empty bundle.

getTriggeredContentAuthorities

added in API level 24
String[] getTriggeredContentAuthorities ()

For jobs with addTriggerContentUri(JobInfo.TriggerContentUri) set, this reports which content authorities have triggered the job. It will only be null if no authorities have triggered it -- that is, the job executed for some other reason, such as a deadline expiring. If this is non-null, you can use getTriggeredContentUris() to retrieve the details of which URIs changed (as long as that has not exceeded the maximum number it can reported).

Returns
String[]

This value may be null.

getTriggeredContentUris

added in API level 24
Uri[] getTriggeredContentUris ()

For jobs with addTriggerContentUri(JobInfo.TriggerContentUri) set, this reports which URIs have triggered the job. This will be null if either no URIs have triggered it (it went off due to a deadline or other reason), or the number of changed URIs is too large to report. Whether or not the number of URIs is too large, you can always use getTriggeredContentAuthorities() to determine whether the job was triggered due to any content changes and the authorities they are associated with.

Returns
Uri[]

This value may be null.

isOverrideDeadlineExpired

added in API level 21
boolean isOverrideDeadlineExpired ()

For jobs with setOverrideDeadline(long) set, this provides an easy way to tell whether the job is being executed due to the deadline expiring. Note: If the job is running because its deadline expired, it implies that its constraints will not be met.

Returns
boolean

writeToParcel

added in API level 21
void writeToParcel (Parcel dest, 
                int flags)

Flatten this object in to a Parcel.

Parameters
dest Parcel: The Parcel in which the object should be written.

flags int: Additional flags about how the object should be written. May be 0 or PARCELABLE_WRITE_RETURN_VALUE.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)