Android
Planification du travail
Recherche…
Remarques
Attention à exécuter beaucoup de code ou à faire un gros travail dans votre JobService
, par exemple dans onStartJob()
. Le code s'exécutera sur le thread principal / UI et peut donc entraîner une interface utilisateur bloquée, ne répondant plus à l'application ou même un plantage de votre application!
À cause de cela, vous devez décharger le travail, par exemple en utilisant un Thread
ou un AsyncTask
.
Utilisation de base
Créer un nouveau JobService
Cela se fait en étendant la classe JobService
et en implémentant / onStartJob()
méthodes requises onStartJob()
et onStopJob()
.
public class MyJobService extends JobService
{
final String TAG = getClass().getSimpleName();
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.i(TAG, "Job started");
// ... your code here ...
jobFinished(jobParameters, false); // signal that we're done and don't want to reschedule the job
return false; // finished: no more work to be done
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.w(TAG, "Job stopped");
return false;
}
}
Ajoutez le nouveau JobService à votre AndroidManifest.xml
L'étape suivante est obligatoire , sinon vous ne pourrez pas exécuter votre travail:
Déclarez votre classe MyJobService
tant que nouvel élément <service>
entre <application> </application>
dans votre fichier AndroidManifest.xml .
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example">
<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:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
Configurer et exécuter le travail
Après avoir implémenté un nouveau JobService et l'a ajouté à votre AndroidManifest.xml , vous pouvez continuer les étapes finales.
-
onButtonClick_startJob()
prépare et exécute un travail périodique. Outre les tâches périodiques,JobInfo.Builder
permet de spécifier de nombreux autres paramètres et contraintes. Par exemple, vous pouvez définir qu'un chargeur branché ou une connexion réseau est nécessaire pour exécuter le travail. -
onButtonClick_stopJob()
annule tous les travaux en cours d'exécution
public class MainActivity extends AppCompatActivity
{
final String TAG = getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onButtonClick_startJob(View v) {
// get the jobScheduler instance from current context
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
// MyJobService provides the implementation for the job
ComponentName jobService = new ComponentName(getApplicationContext(), MyJobService.class);
// define that the job will run periodically in intervals of 10 seconds
JobInfo jobInfo = new JobInfo.Builder(1, jobService).setPeriodic(10 * 1000).build();
// schedule/start the job
int result = jobScheduler.schedule(jobInfo);
if (result == JobScheduler.RESULT_SUCCESS)
Log.d(TAG, "Successfully scheduled job: " + result);
else
Log.e(TAG, "RESULT_FAILURE: " + result);
}
public void onButtonClick_stopJob(View v) {
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
Log.d(TAG, "Stopping all jobs...");
jobScheduler.cancelAll(); // cancel all potentially running jobs
}
}
Après avoir appelé onButtonClick_startJob()
, le travail sera exécuté approximativement à intervalles de 10 secondes, même lorsque l'application est en pause (le bouton d'accueil de l'utilisateur et l'application ne sont plus visibles).
Au lieu d'annuler tous les travaux en cours d'exécution dans onButtonClick_stopJob()
, vous pouvez également appeler jobScheduler.cancel()
pour annuler un travail spécifique en fonction de son ID de travail.