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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow