Schedulare attività in Android con JobScheduler

Mattepuffo's logo
Schedulare attività in Android con JobScheduler

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!


Condividi

1 Commenti

  • prog_android

    ah bene! questa mi mancava, grazie!

    31/05/2017

Commentami!