web-dev-qa-db-fra.com

Tâche de fond de battage à minuit tous les jours pour traiter et planifier les notifications de ladite journée

Application: Rappels de tâches. L'utilisateur crée une tâche et des horaires lorsque cette tâche est due.

Ce paquet flutter_local_notification me permet de planifier une notification future à l'utilisateur lorsqu'elle crée cette tâche. Qui va bien si je planifie une notification lorsque la tâche est due.

Toutefois, si l'utilisateur oublie de compléter cette tâche et que la journée a maintenant passé lorsque la tâche était due (avec la notification d'origine étant et partie). J'aimerais que l'application continue à informer l'utilisateur qu'ils n'ont pas encore terminé cette tâche une fois par jour, jusqu'à ce qu'ils ouvrent l'application pour annuler la notification/marquez la tâche comme complète.

Je suis certain que les autres devaient avoir déjà créé quelque chose comme ça, mais je me lance de trouver des solutions claires en ligne, alors pensais que je demanderais ici et voir des opinions des peuples sur ce qui serait la meilleure pratique.

Deux solutions que je peux penser:


Tâche de fond quotidien

Une tâche d'arrière-plan à exécuter une fois par jour pour vérifier quelles tâches sont dus et en retard sur ce jour en cours, puis planifiez une notification d'un point plus tard au cours de cette journée.

Séries d'évènements

  • À 00:00 Tous les jours, l'application gère une tâche de fond en vérifiant quelles tâches sont dues aujourd'hui
  • Si une tâche est due aujourd'hui ou est en retard. Calendrier la notification pour plus tard ce jour-là.
  • Si l'application n'est jamais ouverte, ce processus de vérification et d'envoi de notifications se répète tous les jours.

Répéter la notification tous les jours

Exemple de tâche dû sur "lundi"

Au lieu d'avoir une tâche d'arrière-plan courir tous les jours. Pour cet exemple de tâche, je pense que je pouvais planifier une notification le lundi et, en même temps, planifiez également une notification répétée quotidienne pour chaque jour après (mardi, mercredi, jeudi ...) indéfiniment. Ensuite, si l'utilisateur ouvre l'application et complète la tâche, ces notifications répétitives sont annulées. Sinon, l'utilisateur est notifié tous les jours jusqu'à ce qu'ils soient.

Je pense que cette méthode fonctionnerait, mais je souhaite éviter de planifier autant de notifications à l'avenir et que des notifications "aujourd'hui" sont programmées. Comme cette application pourrait potentiellement avoir beaucoup de tâches créées par l'utilisateur.


Mon application flutter ne fonctionne que sur Android pour le moment, mais je ne veux pas exclure iOS . Donc, idéalement une méthode qui fonctionne dans une plate-forme multiples.

Toutes les données sont stockées localement, donc je ne peux pas avoir de backend à remplir les contrôles de données et à envoyer des notifications push.

Pensées sur les solutions à ce problème?

8
Michael Johnston

Solution 1: Android_Alarm_Manager est la meilleure solution pour planifier les tâches d'arrière-plan. Mais le seul inconvénient ne supporte que Android. Commençons:

Après avoir importé ce plugin à votre projet comme d'habitude, ajoutez les éléments suivants à votre AndroidManifest.xml dans les balises:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission Android:name="Android.permission.WAKE_LOCK"/>

Ensuite, dans les balises, ajoutez:

<service
    Android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
    Android:permission="Android.permission.BIND_JOB_SERVICE"
    Android:exported="false"/>
<receiver
    Android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
    Android:exported="false"/>
<receiver
    Android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
    Android:enabled="false">
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
Then in Dart code add:

import 'package:Android_alarm_manager/Android_alarm_manager.Dart';

void printHello() {
  final DateTime now = DateTime.now();
  final int isolateId = Isolate.current.hashCode;
  print("[$now] Hello, world! isolate=${isolateId} function='$printHello'");
}

main() async {
  final int helloAlarmID = 0;
  await AndroidAlarmManager.initialize();
  runApp(...);
  await AndroidAlarmManager.periodic(const Duration(minutes: 1), helloAlarmID, printHello);
}

Si vous souhaitez planifier toute tâche tous les jours à une heure précise, vous devez faire quelque chose comme ceci:

if (Platform.isAndroid) {
   await AndroidAlarmManager.periodic(
      const Duration(hours: 24), //Do the same every 24 hours
      helloAlarmID, //Different ID for each alarm
      printHello,
      wakeup: true, //the device will be woken up when the alarm fires
      startAt: DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 5, 0), //Start whit the specific time 5:00 am
      rescheduleOnReboot: true, //Work after reboot
   );
}

Si les rappels d'alarme auront besoin d'un accès à d'autres plug-ins flutter, y compris le plug-in Alarm Manager lui-même, il peut être nécessaire d'informer le service d'arrière-plan comment initialiser les plugins en fonction duquel flutter Android Incorporer l'application utilise .

Cela se fait en donnant à l'alarmservice un rappel pour appeler la méthode OnCreate de l'application.

En particulier, sa classe d'application est la suivante:

public class Application extends FlutterApplication implements PluginRegistrantCallback {
    @Override
    public void onCreate() {
        super.onCreate();
        AlarmService.setPluginRegistrant(this);
    }

    @Override
    public void registerWith(PluginRegistry registry) {
        //add AndroidAlarmManagerPlugin plugin register  if you work with arlarm
        AndroidAlarmManagerPlugin.registerWith(registry.registrarFor("io.flutter.plugins.androidalarmmanager.AndroidAlarmManagerPlugin"));
    }
}

Qui doit être reflété dans l'androidmanifest.xml de l'application. Par exemple.:

<application
        Android:name=".Application"
        ...

Solution 2: Cron est une autre meilleure solution pour planifier les tâches de fond. Cron Run Tâches périodiquement à des temps fixes, dates ou intervalles. Mais le désavantage onliy du maïs est une fois l'application tuée, cron ne fonctionne pas en arrière-plan comme prévu.

Un simple exemple d'utilisation:

import 'package:cron/cron.Dart';

main() {
  var cron = new Cron();
  cron.schedule(new Schedule.parse('*/3 * * * *'), () async {
    print('every three minutes');
  });
  cron.schedule(new Schedule.parse('8-11 * * * *'), () async {
    print('between every 8 and 11 minutes');
  });
}

Comment configurer un cronjob en général: informations

Test cronjob: crontab

1
moe safar