Pourquoi avons-nous besoin de la nouvelle Android WorkManager si nous avons déjà un JobScheduler avec quelques chouettes backports (AndroidJob et FirebaseJobDispatcher) avec les mêmes fonctionnalités? Quel tueur de fonctionnalités, ou quelque chose? Parce que je ne vois rien qui me donne envie de migrer vers encore un autre programmateur.
Réponses
Trop de publicités?"WorkManager a beaucoup de fonctionnalités intéressantes, mais son but principal est d'utiliser la JobScheduler de l'API sur les appareils plus anciens"... Attendre, mais nous avons déjà quelques backports. Ce qui ne va pas avec eux? Pour couper court:
FireaseJobDispatcher est bien, mais cela nécessite de Jeu de Google pour ordonnancer les travaux qui n'est pas bonne, si nous visons la Chine, par exemple.
Evernote AndroidJob est un excellent backport avec beaucoup de fonctionnalités. À mon humble avis, c' est le meilleur choix pour la planification des travaux. Mais maintenant la dernière version de la bibliothèque utilise le susmentionnés WorkManager sous le capot. Et, malheureusement, tôt ou tard, la bibliothèque sera obsolète:
Si vous démarrez un nouveau projet, vous devriez être en utilisant WorkManager à la place de cette bibliothèque. Vous devriez également commencer la migration de votre code à partir de cette bibliothèque à WorkManager. À un certain moment dans l'avenir, cette bibliothèque sera obsolète.
Ils suggèrent de passer à la WorkManager, car il offre plus de fonctionnalités et ils nous donnent aussi une petite comparaison:
| Feature | android-job | WorkManager |
| ------------------ | ----------- | ----------- |
| Exact jobs | Yes | No |
| Transient jobs | Yes | No |
| Daily jobs | Yes | No |
| Custom Logger | Yes | No |
| Observe job status | No | Yes |
| Chained jobs | No | Yes |
| Work sequences | No | Yes |
L'omi, les 3 dernières fonctionnalités sont très utiles et pris en charge uniquement par le WorkManager. Donc la réponse à ma dernière question est oui, elle a quelques killer-features:
- Pas de Google Play requis
- Queryable
- Chainable
- Opportuniste
Pour en savoir plus sur WorkManager il faut vraiment regarder de ce parler par Sumir Kataria
P. S. Si quelqu'un sait pourquoi FirebaseJobDispatcher est activement soutenu par les ingénieurs Google au lieu d'être obsolète écrire dans les commentaires ci-dessous :)
WorkManager
utilise JobScheduler
service pour planifier les travaux. Si JobScheduler
n'est pas pris en charge par l'appareil, puis il utilise Firebase JobDispatcher
de service.
Si Firebase JobDispatcher
n'est pas disponible sur l'appareil, il utilisera AlarmManager
et BroadcastReceiver
.
Donc, avec WorkManager
, vous n'avez pas besoin de vous soucier de la compatibilité descendante. En plus de cela, il permet de définir des contraintes qui doivent être satisfaites pour que le travail à exécuter, telles que la définition des contraintes réseau, le niveau de la batterie, état de la charge et le niveau de stockage.
Il permet tâche de chaînage et de passage d'argument pour le travail.
http://www.zoftino.com/scheduling-tasks-with-workmanager-in-android
WorkManager semble juste comme Google, la réponse à Evernote Android-Travail de la bibliothèque, mais avec quelques améliorations. Il utilise JobScheduler, Firebase JobDispatcher et AlarmManager tout comme Android-Emploi selon le dispositif de l'API de niveau. Leur utilisation de balises ressemble à peu près la même et l'attribution des contraintes à l'emploi/travail sont assez similaires.
Les deux caractéristiques que je suis excité au sujet de sont: être capable de la chaîne de travail et la capacité à être opportuniste sur le travail avec des contraintes. La première permettra de travail (emplois) à être brisé et plus modulaire pour moi. Et avec plus modulaire, chaque pièce de travail peut avoir moins de contraintes amélioration de la probabilité de terminer plus tôt (opportunistes). Par exemple, la majorité des travaux de traitement peut se terminer avant que le travail avec un réseau de contrainte de besoins à satisfaire.
Donc, si vous êtes heureux avec votre planificateur de mise en œuvre, et les deux caractéristiques que j'ai mentionné ne pas ajouter de la valeur, je ne vois pas un énorme avantage pour faire de l'interrupteur pour l'instant. Mais si vous écrivez quelque chose de nouveau, il sera probablement la peine d'utiliser WorkManager.
Dans mes tests, JobScheduler pourrait continuer l'exécution d'un service une fois que l'utilisateur ferme mon application, mais je n'ai trouvé aucun moyen de le faire avec WorkManager.
J'ai testé sur un Nexus 5 FOIS l'exécution de Oreo Android 8.0.0 (API 26). J'ai peut-être juste eu de la chance que ce dispositif/système d'exploitation combinaison pourrait continuer le service après le meurtre de l'application. Je crois qu'il pourrait être spécifiques de périphérique à cause de ce que j'ai lu dans cette réponse https://stackoverflow.com/a/52605503/2848676 pour Android. Est WorkManager cours d'exécution lorsque l'application est fermée?. "Vous pouvez trouver une liste complète des différents OEM comportements sur dontkillmyapp.com."
NOTE: j'ai observé que lorsque l'utilisateur a fermé l'application, il a fallu plusieurs secondes, voire quelques minutes pour le JobService à redémarrer.
Pour faire JobScheduler lancer un service qui survit à l'application de la mort, a créé le service, comme suit:
JobScheduler jobScheduler = (JobScheduler)applicationContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName componentName = new ComponentName(applicationContext, ScannerAsJobService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, componentName)
.setPersisted(true) // relaunch on reboot
.setMinimumLatency(1)
.setOverrideDeadline(1)
.build();
int result = jobScheduler.schedule(jobInfo);
ScannerAsJobService
mises à jour, une notification avec des informations actuelles, y compris si le service est "le fond" (que je cite parce qu'il y a différentes définitions du terme "arrière-plan", mais celui-ci reflète correctement si l'application n'était plus en cours d'exécution):
import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Handler;
import androidx.annotation.RequiresApi;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class ScannerAsJobService extends JobService {
private static final String TAG = "ScannerAsJobService";
private static final String NOTIFICATION_CHANNEL_ID = "ll_notification_channel";
final Handler workHandler = new Handler();
Runnable workRunnable;
@Override
public boolean onStartJob(JobParameters params) {
workRunnable = new Runnable() {
@Override
public void run() {
// See https://stackoverflow.com/questions/45692181/android-job-scheduler-schedule-job-to-execute-immediately-and-exactly-once
(new Timer()).schedule(new TimerTask() {
@Override
public void run() {
String message = "Time: " + (new Date()).toString() + " background: " + appIsInBackground();
// https://stackoverflow.com/a/32346246/2848676
Intent intent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(ScannerAsJobService.this, 1, intent, 0);
Notification.Builder builder = new Notification.Builder(ScannerAsJobService.this);
builder.setAutoCancel(false);
builder.setTicker("my ticker info");
builder.setContentTitle("my content title");
builder.setContentText(message);
builder.setSmallIcon(R.drawable.my_icon);
builder.setContentIntent(pendingIntent);
// builder.setOngoing(true); // optionally uncomment this to prevent the user from being able to swipe away the notification
builder.setSubText("my subtext"); //API level 16
builder.setNumber(100);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
setupNotificationChannel(NOTIFICATION_CHANNEL_ID);
builder.setChannelId(NOTIFICATION_CHANNEL_ID);
}
builder.build();
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(93423, builder.build());
Log.d(TAG + " Notification message: " + message);
}
}, 1 * 1000, 5 * 1000);
jobFinished(params, true);
}
};
workHandler.post(workRunnable);
// return true so Android knows the workRunnable is continuing in the background
return true;
}
// https://stackoverflow.com/a/45692202/2848676
@RequiresApi(api = Build.VERSION_CODES.O)
private void setupNotificationChannel(String channelId) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The user-visible name of the channel.
CharSequence name = getString(R.string.my_channel_name);
// The user-visible description of the channel.
String description = getString(R.string.my_channel_name);
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
// Configure the notification channel.
mChannel.setDescription(description);
mChannel.enableLights(true);
// Sets the notification light color for notifications posted to this
// channel, if the device supports this feature.
mChannel.setLightColor(Color.RED);
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
mNotificationManager.createNotificationChannel(mChannel);
}
/**
* Source: <a href="https://stackoverflow.com/a/39589149/2848676">https://stackoverflow.com/a/39589149/2848676</a>
* @return true if the app is in the background, false otherwise
*/
private boolean appIsInBackground() {
ActivityManager.RunningAppProcessInfo myProcess = new ActivityManager.RunningAppProcessInfo();
ActivityManager.getMyMemoryState(myProcess);
boolean isInBackground = myProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
return isInBackground;
}
@Override
public boolean onStopJob(JobParameters params) {
// returning true schedules the job for retry (we're using it to implement periodicity since
// JobInfo.Builder.setPeriodic() didn't work
return true;
}
}
WorkManager se trouve au-dessus de JobScheduler et AlarmManager. WorkManager sélectionne les bonnes API à utiliser, en fonction de conditions telles que le niveau d'API de l'appareil de l'utilisateur
WorkManager est une bibliothèque simple mais incroyablement flexible qui présente de nombreux avantages supplémentaires. Ceux-ci inclus:
-Support for both asynchronous one-off and periodic tasks.
-Support for constraints such as network conditions, storage space, and charging -status
-Chaining of complex work requests, including running work in parallel.
-Output from one work request used as input for the next.
-Handles API level compatibility back to API level 14.
-Works with or without Google Play services.
-Follows system health best practices.
-LiveData support to easily display work request state in UI.