1

Я хочу, чтобы мой пользователь установил время для получения ежедневного напоминания из моего приложения. В моей ReminderActivity я создаю PendingIntent и диспетчер аварийных сообщений, а затем в моем классе Alarm Receiver создаю уведомление внутри onReceive(). Я пытался использовать флаги FLAG_CANCEL_CURRENT и FLAG_UPDATE_CURRENT при создании ожидающего намерения, но все же, когда я тестирую приложение и изменяю время напоминания, иногда иногда уведомление не приходит вообще, или оно появляется только тогда, когда приложение работает в фоновом режиме и экран включен. Я был бы очень благодарен за любую мысль или идеи.Местное уведомление Android не приходит каждый раз

код ReminderActivity:

private void setNotification() { 

    Calendar calendar = Calendar.getInstance(); 
    Calendar now = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, chosenHour); 
    calendar.set(Calendar.MINUTE, chosenMinute); 
    calendar.set(Calendar.SECOND, 0); 

    //if user sets the alarm after their preferred time has already passed that day 
    if(now.after(calendar)) { 
     calendar.add(Calendar.DAY_OF_MONTH, 1); 
    } 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    pendingIntent = PendingIntent.getBroadcast(ReminderActivity.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

} 

сигнализации код получателя:

@Override 
public void onReceive(Context context, Intent intent) { 

    Bitmap largeLogo = BitmapFactory.decodeResource(context.getResources(), 
      R.drawable.ptwired_logo); 

    //create local notification 
    NotificationManager notificationManager = (NotificationManager) context 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    Intent notificationIntent = new Intent(context, MainActivity.class); 
    //notificationIntent.putExtra("FromPTWired", true); //to track if user opens the app from the daily digest notification 

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

    Notification notification = new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.ptwired_logo) 
      .setLargeIcon(largeLogo) 
      .setContentTitle(context.getResources().getString(R.string.app_name)) 
      .setPriority(NotificationCompat.PRIORITY_HIGH) 
      .setContentIntent(pendingIntent) 
      .setContentText(REMINDER_TEXT) 
      .setAutoCancel(true) 
      .setOngoing(false) 
      .build(); 



    notificationManager.notify(1, notification); 

    } 
} 

ответ

0

Вероятно, вопрос о спящем режиме, посмотрите в Android ограничения:

дремлют ограничения

применяются следующие ограничения к приложениям в дремлют:

Стандартный AlarmManager сигнализации (в том числе setExact() и setWindow()) откладываются до следующего окна обслуживания.

Если вам нужно установить аварийные сигналы, которые срабатывают во время Doze, используйте setAndAllowWhileIdle() или setExactAndAllowWhileIdle().

Сигнализации, установленные с помощью setAlarmClock() продолжают нормально срабатывать - система выходит из Doos незадолго до того, как эти тревоги загорелись.

+0

Спасибо @ motis10 Но 'setExactAndAllowWhileIdle()' не запрашивает значение «интервал», и я хочу, чтобы будильник повторялся каждый день в одно и то же время. –

+0

Справа. но вы можете установить будильник каждый setExactAndAllowWhileIdle(). Например, намерение может вызвать услугу. и служба может выполнять функцию универсальности + установить новый сигнал тревоги на следующий день. – motis10

+0

У вас есть. Дело в том, что я не пользуюсь сервисом. Только BroadcastReceiver. –