Я создаю свое первое приложение для 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);