Java源码示例:com.evernote.android.job.util.support.PersistableBundleCompat
示例1
@Override
@NonNull
protected Result onRunJob(Params params) {
Log.d(TAG, "Job is running");
PersistableBundleCompat requestExtras = params.getExtras();
// Two different types of bundle so need to re-package
Bundle headlessExtras = new Bundle();
headlessExtras.putInt("timeout", requestExtras.getInt("timeout", 30));
Context context = getContext().getApplicationContext();
Intent service = new Intent(context, HeadlessTaskService.class);
service.putExtras(headlessExtras);
context.startService(service);
return Result.SUCCESS;
}
示例2
@Override
public void createPeriodic() {
for (int i = 0; i < 10; i++) {
JobRequest.Builder builder = new JobRequest.Builder("tag")
.setPeriodic(TimeUnit.MINUTES.toMillis(1))
.setRequiresCharging(random())
.setRequiresDeviceIdle(random())
.setRequiredNetworkType(random() ? JobRequest.NetworkType.ANY : JobRequest.NetworkType.CONNECTED)
.setRequirementsEnforced(random());
if (random()) {
PersistableBundleCompat extras = new PersistableBundleCompat();
extras.putString("key", "Hello world");
builder.setExtras(extras);
}
builder.build().schedule();
}
}
示例3
@Override
public void createPeriodic() {
for (int i = 0; i < 10; i++) {
JobRequest.Builder builder = new JobRequest.Builder("tag")
.setRequiresCharging(random())
.setRequiresDeviceIdle(random())
.setRequiredNetworkType(random() ? JobRequest.NetworkType.ANY : JobRequest.NetworkType.CONNECTED)
.setRequirementsEnforced(random());
if (random()) {
PersistableBundleCompat extras = new PersistableBundleCompat();
extras.putString("key", "Hello world");
builder.setExtras(extras);
}
if (random()) {
builder.setPeriodic(JobRequest.MIN_INTERVAL);
} else {
builder.setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX);
}
builder.build().schedule();
}
}
示例4
@Override
public void createPeriodic() {
for (int i = 0; i < 10; i++) {
JobRequest.Builder builder = new JobRequest.Builder("tag")
.setRequiresCharging(random())
.setRequiresDeviceIdle(random())
.setRequiresBatteryNotLow(random())
.setRequiresStorageNotLow(random())
.setRequiredNetworkType(random() ? JobRequest.NetworkType.ANY : JobRequest.NetworkType.CONNECTED)
.setRequirementsEnforced(random());
if (random()) {
PersistableBundleCompat extras = new PersistableBundleCompat();
extras.putString("key", "Hello world");
builder.setExtras(extras);
}
if (random()) {
builder.setPeriodic(JobRequest.MIN_INTERVAL);
} else {
builder.setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX);
}
builder.build().schedule();
}
}
示例5
@Test
public void testPeriodic() {
long interval = JobRequest.MIN_INTERVAL * 5;
JobRequest request = getBuilder()
.setPeriodic(interval)
.setExtras(new PersistableBundleCompat())
.build();
assertThat(request.getJobId()).isGreaterThan(0);
assertThat(request.getTag()).isEqualTo(DummyJobs.SuccessJob.TAG);
assertThat(request.getIntervalMs()).isEqualTo(interval);
assertThat(request.getFlexMs()).isEqualTo(interval);
assertThat(request.isPeriodic()).isTrue();
assertThat(request.isFlexSupport()).isFalse();
assertThat(request.getStartMs()).isNegative();
assertThat(request.getEndMs()).isNegative();
assertThat(request.getBackoffMs()).isEqualTo(JobRequest.DEFAULT_BACKOFF_MS);
assertThat(request.getBackoffPolicy()).isEqualTo(JobRequest.DEFAULT_BACKOFF_POLICY);
assertThat(request.getExtras()).isNotNull();
assertThat(request.isExact()).isFalse();
assertThat(request.requiredNetworkType()).isEqualTo(JobRequest.DEFAULT_NETWORK_TYPE);
assertThat(request.requirementsEnforced()).isFalse();
assertThat(request.requiresCharging()).isFalse();
assertThat(request.requiresDeviceIdle()).isFalse();
}
示例6
@Test
public void verifyExtraValuesAreOverwritten() {
long start = 0;
long end = 1L;
PersistableBundleCompat extras = new PersistableBundleCompat();
extras.putLong("something", 9L); // make sure this value is not overwritten
extras.putLong(DailyJob.EXTRA_START_MS, 9L); // make sure they're overwritten
extras.putLong(DailyJob.EXTRA_END_MS, 9L);
int jobId = DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class).setExtras(extras), start, end);
JobRequest request = manager().getJobRequest(jobId);
assertThat(request).isNotNull();
assertThat(request.getExtras().getLong(DailyJob.EXTRA_START_MS, -1)).isEqualTo(0L);
assertThat(request.getExtras().getLong(DailyJob.EXTRA_END_MS, -1)).isEqualTo(1L);
assertThat(request.getExtras().size()).isEqualTo(3);
}
示例7
static JobRequest adapt(UploadRequest request) {
PersistableBundleCompat extras = new PersistableBundleCompat();
request.populateParamsFromFields(new AndroidJobRequestParams(extras));
UploadPolicy policy = request.getUploadPolicy();
JobRequest.Builder builder = new JobRequest.Builder(JOB_TAG)
.setBackoffCriteria(policy.getBackoffMillis(), adaptPolicy(policy.getBackoffPolicy()))
.setExtras(extras)
.setExecutionWindow(request.getTimeWindow().getMinLatencyOffsetMillis(), request.getTimeWindow().getMaxExecutionDelayMillis())
.setRequiredNetworkType(adaptNetworkType(policy.getNetworkType()))
.setRequiresCharging(policy.isRequiresCharging())
.setRequiresDeviceIdle(policy.isRequiresIdle())
.setRequirementsEnforced(true);
return builder.build();
}
示例8
public static void performJob(String taskIdentifier, String messageId){
PersistableBundleCompat persistableBundleCompat = new PersistableBundleCompat();
persistableBundleCompat.putString("taskIdentifier", taskIdentifier);
persistableBundleCompat.putString("messageId", messageId);
new JobRequest.Builder(SendMessageJob.TAG)
.startNow()
.setExtras(persistableBundleCompat)
.build()
.schedule();
}
示例9
/**
* Main point of interaction from JS users - allows them to specify the scheduling etc for the
* background task.
*
* Default values are specified in JS (more accessible for the average user).
*
* @param config the config options passed in from JS:
* - period (required): how frequently to carry out the task in seconds
* - timeout (required): after how many seconds should the task be auto-killed
*/
@ReactMethod
public void schedule(final ReadableMap config) {
Log.d(TAG, "@ReactMethod BackgroundTask.schedule");
// Period can't be below 15m
int period = config.getInt("period");
if (period < 900) { period = 900; }
// Flex must be between 5m and 15m
int flex = config.getInt("flex");
if (flex < 300) { flex = 300; }
if (flex > 900) { flex = 900; }
// Extra info to store with the JobRequest
PersistableBundleCompat extras = new PersistableBundleCompat();
extras.putInt("timeout", config.getInt("timeout"));
mJobRequest = new JobRequest.Builder(RNJob.JOB_TAG)
.setPeriodic(TimeUnit.SECONDS.toMillis(period), TimeUnit.SECONDS.toMillis(flex))
.setPersisted(true)
.setExtras(extras)
.build();
if (!mForeground) {
commitSchedule();
}
}
示例10
/**
* @return The extras for this job.
*/
public PersistableBundleCompat getExtras() {
if (mBuilder.mExtras == null && !TextUtils.isEmpty(mBuilder.mExtrasXml)) {
mBuilder.mExtras = PersistableBundleCompat.fromXml(mBuilder.mExtrasXml);
}
return mBuilder.mExtras;
}
示例11
/**
* Adds optional extras. This is persisted, so only primitive types are allowed. This method overrides
* values with the same keys inside of {@code extras}, which were set before.
*
* @param extras Bundle containing extras which you can retrieve with {@link Job.Params#getExtras()}.
*/
public Builder addExtras(@NonNull PersistableBundleCompat extras) {
if (mExtras == null) {
mExtras = extras;
} else {
mExtras.putAll(extras);
}
mExtrasXml = null;
return this;
}
示例12
/**
* Schedules the daily job only once and runs it immediately. This is helpful if you want to reuse your job
* and want to trigger the execution immediately. It's possible to schedule a daily job normally with
* {@link #schedule(JobRequest.Builder, long, long)} and this method at the same time to trigger the
* execution immediately.
*
* @param baseBuilder The builder of your daily job.
* @return The unique ID for this job.
*/
public static int startNowOnce(@NonNull JobRequest.Builder baseBuilder) {
PersistableBundleCompat extras = new PersistableBundleCompat();
extras.putBoolean(EXTRA_ONCE, true);
return baseBuilder
.startNow()
.addExtras(extras)
.build()
.schedule();
}
示例13
protected ContentValues createBaseContentValues(int id) {
ContentValues contentValues = new ContentValues();
contentValues.put(JobStorage.COLUMN_ID, id);
contentValues.put(JobStorage.COLUMN_TAG, "Tag");
contentValues.put(JobStorage.COLUMN_START_MS, -1L);
contentValues.put(JobStorage.COLUMN_END_MS, -1L);
contentValues.put(JobStorage.COLUMN_BACKOFF_MS, JobRequest.DEFAULT_BACKOFF_MS);
contentValues.put(JobStorage.COLUMN_BACKOFF_POLICY, JobRequest.DEFAULT_BACKOFF_POLICY.toString());
contentValues.put(JobStorage.COLUMN_INTERVAL_MS, 0L);
contentValues.put(JobStorage.COLUMN_REQUIREMENTS_ENFORCED, false);
contentValues.put(JobStorage.COLUMN_REQUIRES_CHARGING, false);
contentValues.put(JobStorage.COLUMN_REQUIRES_DEVICE_IDLE, false);
contentValues.put(JobStorage.COLUMN_EXACT, false);
contentValues.put(JobStorage.COLUMN_NETWORK_TYPE, JobRequest.DEFAULT_NETWORK_TYPE.toString());
contentValues.put(JobStorage.COLUMN_EXTRAS, new PersistableBundleCompat().saveToXml());
contentValues.put("persisted", false);
contentValues.put(JobStorage.COLUMN_NUM_FAILURES, 0);
contentValues.put(JobStorage.COLUMN_SCHEDULED_AT, System.currentTimeMillis());
return contentValues;
}
示例14
@NonNull
@Override
protected final Result onRunJob(@NonNull Params params) {
PersistableBundleCompat extras = params.getExtras();
boolean runOnce = extras.getBoolean(EXTRA_ONCE, false);
if (!runOnce && (!extras.containsKey(EXTRA_START_MS) || !extras.containsKey(EXTRA_END_MS))) {
CAT.e("Daily job doesn't contain start and end time");
return Result.FAILURE;
}
DailyJobResult result = null;
try {
if (meetsRequirements(true)) {
result = onRunDailyJob(params);
} else {
result = DailyJobResult.SUCCESS; // reschedule
CAT.i("Daily job requirements not met, reschedule for the next day");
}
} finally {
if (result == null) {
// shouldn't happen if the job follows the contract
result = DailyJobResult.SUCCESS;
CAT.e("Daily job result was null");
}
if (!runOnce) {
JobRequest request = params.getRequest();
if (result == DailyJobResult.SUCCESS) {
CAT.i("Rescheduling daily job %s", request);
// don't update current, it would cancel this currently running job
int newJobId = schedule(request.createBuilder(), false,
extras.getLong(EXTRA_START_MS, 0) % DAY, extras.getLong(EXTRA_END_MS, 0L) % DAY, true);
request = JobManager.instance().getJobRequest(newJobId);
if (request != null) {
request.updateStats(false, true);
}
} else {
CAT.i("Cancel daily job %s", request);
}
}
}
return Result.SUCCESS;
}
示例15
private AndroidJobRequestParams(PersistableBundleCompat bundle) {
this.bundle = bundle;
}