Android WorkManager для уведомлений - PullRequest
0 голосов
/ 25 октября 2019

Я создаю свое первое приложение для Android, это словарный запас. Я пытаюсь отправлять уведомления каждый час, используя PeriodicWorkRequest. Я заметил, что когда приложение убивают (убирают с экрана обзора), уведомления продолжают срабатывать, но кнопки действий не работают.

В большинстве постов, которые я читаю онлайн, говоритсяиспользовать службу переднего плана, а также динамически регистрировать мой широковещательный приемник. С другой стороны, в некоторых сообщениях говорится, что WorkManager или JobScheduler могут решить эту проблему. Как я могу решить эту проблему, используя WorkManager, если это возможно? если нет, то как использовать службу в этой ситуации?

AndroidManifest.xml

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

// other parts of manifest file
        <receiver
            android:name=".MainActivity$NotificationBroadcast"
            android:enabled="true"/>

SendNotificationWorker.java - мой метод уведомления внутриdoWork ();

public void sendOnChannel1(Word word, int wordNum) {
            Intent activityIntent = new Intent(getApplicationContext(), WordStatsActivity.class);
            activityIntent.putExtra(STATS_WORD, word);
            PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext()
                    , 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);

            Intent knewBroad = new Intent(getApplicationContext(), MainActivity.NotificationBroadcast.class);
            knewBroad.setAction(KNEW_WORD);
            knewBroad.putExtra(WORD_FROM_NOTIFICATION, word);
            PendingIntent knewIntent = PendingIntent.getBroadcast(getApplicationContext(),
                    1, knewBroad, PendingIntent.FLAG_UPDATE_CURRENT);

            Intent didntKnowBroad= new Intent(getApplicationContext(), MainActivity.NotificationBroadcast.class);
            didntKnowBroad.setAction(DIDNT_KNOW_WORD);
            didntKnowBroad.putExtra(WORD_FROM_NOTIFICATION, word);
            PendingIntent didntKnew = PendingIntent.getBroadcast(getApplicationContext(),
                    2, didntKnowBroad, PendingIntent.FLAG_UPDATE_CURRENT);

            Intent stopShowBroad = new Intent(getApplicationContext(), MainActivity.NotificationBroadcast.class);
            stopShowBroad.setAction(NOTIFICATION_OFF);
            stopShowBroad.putExtra(WORD_FROM_NOTIFICATION, word);
            PendingIntent stopShowIntent = PendingIntent.getBroadcast(getApplicationContext(),
                    3, stopShowBroad, PendingIntent.FLAG_UPDATE_CURRENT);

            Notification notification = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_1_ID)
                    // more attributes
                    .setContentIntent(contentIntent)
                    .addAction(R.mipmap.ic_roundicon, "know", knewIntent)
                    .addAction(R.mipmap.ic_roundicon, "don't know", didntKnew)
                    .addAction(R.mipmap.ic_roundicon, "don't show again", stopShowIntent)
                    .build();
            notificationManager.notify(word.getId(), notification);
        }

NotificationBroadcast внутри MainActivity

public static class NotificationBroadcast extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Word word = (Word) intent.getSerializableExtra(WORD_FROM_NOTIFICATION);
            String action = intent.getAction();
            try {
                switch (action) {
                    case KNEW_WORD:
                        knewWordAction(word, context);
                        break;
                    case DIDNT_KNOW_WORD:
                        didntKnowWordAction(word, context);
                        break;
                    case NOTIFICATION_OFF:
                        notificationOffAction(word, context);
                        break;
                }
            } catch (NullPointerException e) {
                Log.d(TAG, "Null word");
            }
        }
// other code

Запрос на работу

PeriodicWorkRequest notiWorker = new PeriodicWorkRequest.Builder
                    (SendNotificationWorker.class, 1, TimeUnit.HOURS)
                    .setInputData(data)
                    .build();
            WorkManager.getInstance().enqueue(notiWorker);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...