0
votes

Comment recevoir une notification quotidienne à une heure spécifique à Android avec Workmanager et OnetimeworkRequest?

mon objectif strong>

Recevez une seule notification tous les 8 heures lorsque mon commutateur est activé P>

Résultat actuel P> P> P> P>

-J'ai reçu une notification chaque fois que je lance l'application si je activais d'abord le commutateur p>

-i reçoive également des notifications sans lancer l'application à un moment quelconque p>

-in addition, je reçois plusieurs notifications en une journée p>

ce que j'ai fait (mon code) strong> p>

-Notification (partie de l'Oncreate) p> xxx PRE>

-NOTIFICITATIFICATION -> Disposition P>

mise en page p>

-NOTIFICATIONRORKER P>

public class NotificationWorker extends Worker {

    private SharedPreferences mPreference;
    private String keyword;
    private String categories;
    private ResultModel resultModel;
    private ResultContract.Model.OnFinishedListener onFinishedListener;
    private int numberOfArticle;


    public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        mPreference = getApplicationContext().getSharedPreferences(NotificationActivity.PREFERENCE_FILE, MODE_PRIVATE);

        keyword = mPreference.getString(NotificationActivity.PREF_KEYWORD, null);
        categories = mPreference.getString(NotificationActivity.PREF_CATEGORIES, null);


        resultModel = new ResultModel();

        numberOfArticle = resultModel.getResultListWithoutDate(onFinishedListener, 1, keyword, categories);

        displayNotification(keyword);

        return Result.success();
    }


    private void displayNotification(String keyword) {

     NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         NotificationChannel channel = new NotificationChannel("simplifiedcoding", "simplifiedcoding", NotificationManager.IMPORTANCE_DEFAULT);
         assert notificationManager != null;
         notificationManager.createNotificationChannel(channel);
     }

     NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "simplifiedcoding")
             .setContentTitle("Articles sur : " + keyword)
             .setContentText("Nombre d'articles trouvés : " + numberOfArticle)
             .setPriority(NotificationCompat.PRIORITY_DEFAULT)
             .setSmallIcon(R.drawable.ic_launcher_background);

        assert notificationManager != null;
        notificationManager.notify(1, builder.build());

    }
}


1 commentaires

Workmanger ne fonctionne pas périodiquement sur la fente exacte de l'heure. Vous pouvez utiliser alarme manager à la place


3 Réponses :


1
votes

Vous pouvez le résoudre de 3 façons.

premier:

Gestionnaire d'alarme utilisateur et mettez cela dans A si cette activité de contrôle est en vie, il fonctionnera de sorte que votre application ouverte.Vous pouvez prendre plus d'informations de Google Docs Link ci-dessous:

AlarmManager Docs

secondaire:

u Peut utiliser une minuterie avec la tâche pour créer une notification, vous pouvez vérifier si une activité vivante à nouveau mais une meilleure utilisation est celle pour créer une minuterie sur le service de premier plan.

Troisième:

Utilisez la poussée du serveur lorsque même vous en avez besoin. Les documents et informations en cas de lien ci-dessous:

Notification Push - Un signal

Remarque:

Je vous recommande d'utiliser la troisième voie pour votre problème.

avoir de bon codage et n'oubliez pas de voter moi;)


4 commentaires

Il n'y a pas une solution sans changer de fois mon code?


Pouvez-vous développer davantage pour votre troisième voie?


Pour la troisième voie, il existe un document clair sur un site de signal. Oui je peux.Si tu ne veux pas d'utiliser du changement d'emploi


n'oubliez pas de vérifier ma réponse;)



0
votes

Comme votre objectif est de recevoir une notification tous les jours à 8 heures du matin, je vous recommanderais d'utiliser périodiqueworkRequest plutôt que d'utiliser OnetimeWorkRest .

périodique professionnel (de la documentation):

Un travail de travail pour un travail répété. Ce travail exécute plusieurs fois jusqu'à ce qu'il soit annulé, la première exécution se produise immédiatement ou dès que les contraintes données sont remplies. La prochaine exécution va arriver pendant l'intervalle de la période; Notez que l'exécution peut être retardée Parce que Workmanager est soumis aux optimisations de la batterie OS, telles que MODE DOZE.

onetimeworkRequest (de la documentation):

Un travail de travail pour un travail non répété.


1 commentaires

Le problème avec la périodique du travail est que c'est l'intervalle, il n'est donc pas aussi précis que la définition d'une heure précise



0
votes

Cela fonctionne lors de l'utilisation périodique du travail. L'astuce consiste à utiliser setinitialdelay code>. xxx pré>

Je vais avoir un périodiqueworkRequest code> avec un intervalle de 1 jour (24 heures) et en utilisant setinitialdelay code> Je peux déplacer l'heure de départ à partir de maintenant mon point de départ souhaité, par exemple 8 heures du matin. NotificationWorker CODE> est aussi simple que: P>

class NotificationWorker(
  context: Context,
  workerParams: WorkerParameters
) : Worker(context, workerParams) {
  override fun doWork(): Result {
    // Your logic to show a notification.

    return Result.success()
  }

  companion object {
    const val TAG = "DailyReminder"
  }
}


0 commentaires