Schedulare attività in Android con JobScheduler
Con le API 21, in Android sono state introdotte delle API per schedulare le attività.
Oggi ne vediamo un esempio basico, che può essere un punto di partenza.
Cominciamo con l'Activity principale:
import android.os.Bundle;
import android.app.Activity;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MainActivity extends Activity {
public static final int JOB_ID = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_schedule_job).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
scheduleJob();
}
});
}
private void scheduleJob() {
ComponentName serviceName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.setOverrideDeadline(400) // Remove comment for faster testing.
.build();
JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
int result = scheduler.schedule(jobInfo);
if (result == JobScheduler.RESULT_SUCCESS) {
Toast.makeText(this, "Job schedulato con successo", Toast.LENGTH_LONG).show();
}
}
}
Nel nostro metodo scheduleJob abbiamo due oggetti interessanti:
Fatto questo, andiamo a vedere il nostro service (MyJobService):
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.os.AsyncTask;
import android.util.Log;
public class MyJobService extends JobService {
static final String TAG = MyJobService.class.getSimpleName();
private UpdateAppAsync updateTask = new UpdateAppAsync();
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "ON INIZIO JOB: id=" + params.getJobId());
updateTask.execute(params);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG, "ON STOP JOB: id=" + params.getJobId());
boolean shouldReschedule = updateTask.stopJob(params);
return shouldReschedule;
}
private class UpdateAppAsync extends AsyncTask<JobParameters, Void, JobParameters[]> {
@Override
protected JobParameters[] doInBackground(JobParameters... params) {
Log.d(TAG, "AGGIORNAMENTO IN BACKGROUND");
return params;
}
@Override
protected void onPostExecute(JobParameters[] result) {
for (JobParameters params : result) {
if (!hasJobBeenStopped(params)) {
Log.d(TAG, "JOB FINITO: id=" + params.getJobId());
jobFinished(params, false);
}
}
}
private boolean hasJobBeenStopped(JobParameters params) {
return false;
}
public boolean stopJob(JobParameters params) {
Log.d(TAG, "JOB STOP: id=" + params.getJobId());
return false;
}
}
}
La nostra classe estende JobService, ed include una classe privata che estende AsyncTask per eseguire operazioni in background.
Abbiamo quasi finito, ci manca aggiungere il richiamo al service nel nostro AndroidManifest (a parte il Button dentro al layout):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.mp.com.testjobservice">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyJobService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
Provate a lanciare la app, e a vedere il log.
Enjoy!
java androidmanifest jobscheduler jobservice jobinfo asynctask
1 Commenti
ah bene! questa mi mancava, grazie!
31/05/2017