Отправлять локальные уведомления в Android O - PullRequest
0 голосов
/ 01 ноября 2018

Не могу поверить, что спрашиваю об этом, но я хочу запланировать уведомления в своем приложении для Android (повторяется или нет).

Мне удалось сделать это легко, следуя статье об обучении Android, используя WakefulBroadcastReceiver и Service s. Но теперь, поскольку я должен нацелить последние Android API для своих будущих обновлений, я должен внести некоторые изменения в мой код.

Я считаю, что WakefulBroadcastReceiver было устарело , поэтому вместо этого я использую простой BroadcastReceiver.

Текущая реализация

Всякий раз, когда я хочу запланировать будильник, я отправляю Intent на мой BroadcastReceiver, и в методе onReceive вместо старого вызова на startWakefulService(context, service); я выполняю context.startService(service);. Но с фоновыми ограничениями я не могу запустить службу, когда мое приложение находится в фоновом режиме ...

У меня ошибка: java.lang.IllegalStateException: не разрешено запускать службу: приложение в фоновом режиме

Как эффективно изменить свой код для решения этой проблемы? Служба, которую я вызываю, - это та, которая отправляет уведомления пользователю.

Код

  1. Установить будильник

    Intent broadcastIntent = new Intent(context, AlarmReceiver.class);
    // put the extras for the notification details
    // ...
    alarmIntent = PendingIntent.getBroadcast(context, idNotif, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
            millis, interval, alarmIntent);
    
  2. Intent получено в AlarmReceiver классе

    // onReceive method
    context.startService(service); // The ERROR is raised here when my app is in bg
    

EDIT

Я не могу использовать JobScheduler, так как это не гарантирует, что уведомления будут отправлены вовремя.

Я не могу запустить службу переднего плана, чтобы отправлять свои уведомления.

1 Ответ

0 голосов
/ 01 ноября 2018

Я нашел полезную статью, вы можете узнать больше, посетив этот веб-сайт

Для упрощения:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
        notificationIntent.addCategory("android.intent.category.DEFAULT");

        PendingIntent broadcast = PendingIntent.getBroadcast(this, 100, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, 30);
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast);
    }

Приведенный выше код назначит будильник через 30 секунд и передаст notificationIntent.

...