AlarmManager не запускается при закрытии приложения

#android #notifications #alarmmanager #in-app

#Android #уведомления #AlarmManager #в приложении

Вопрос:

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

Настройка будильника:

 Intent alarmIntent = new Intent(mMotherActivity, ReminderAlarmManager.class);

if (ReminderNotificationType.CHANGE_LENS.equals(notificationType)) {
    alarmIntent.putExtra("NOTIFICATION_TYPE", "REMINDER");
} else {
    alarmIntent.putExtra("NOTIFICATION_TYPE", "ORDER");
}

long scTime = alarmDate.getTime();
PendingIntent pendingIntent = PendingIntent.getBroadcast(mMotherActivity, 0, alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager) mMotherActivity.getSystemService(mMotherActivity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, scTime, pendingIntent);
  

широковещательный приемник:

 public class ReminderAlarmManager extends BroadcastReceiver {

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

        String notificationType = intent.getStringExtra("NOTIFICATION_TYPE");
        if(notificationType.equalsIgnoreCase("ORDER"))
        {
            Intent i = new Intent(context, OrderReminderNotificationService.class);
            context.startService(i);
        }
        else if(notificationType.equalsIgnoreCase("REMINDER"))
        {
            Intent i = new Intent(context, ReminderNotificationService.class);
            context.startService(i);
        }
    }
}
  

Поэтому, когда дело доходит до scTime, даже если приложение закрыто, я хотел бы вызвать уведомление. Итак, я вызываю службу с помощью PendingIntent следующим образом:

 public class OrderReminderNotificationService extends IntentService {

    public OrderReminderNotificationService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

        Context context = getApplicationContext();
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            context);

        Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        mBuilder.setContentTitle("Notification");
        mBuilder.setContentText(context.getString(R.string.renewOrderNotificationMsg));
        mBuilder.setSmallIcon(R.mipmap.ic_launcher);
        mBuilder.setSound(uri);
        mBuilder.setAutoCancel(true);

        Intent notificationIntent = new Intent(this, LoginActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        mBuilder.setContentIntent(contentIntent);
        mNotificationManager.notify(2, mBuilder.build());
}
  

Часть в манифесте, касающаяся этого:

 <receiver android:name="com.company.utils.ReminderAlarmManager">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
  

Но ничего не отображается… Что я делаю не так?

Комментарии:

1. Вы вызываете службу из BroadcastReceiver ?

2. Я отредактировал свой пост с полным кодом. Я опубликовал BroadcastReceiver и завершил настройку AlarmManager. Должен ли я что-то сделать в манифесте BOOT_COMPLETED что-то подобное?

3. ваш файл манифеста тоже необходим. Я имею в виду, вы зарегистрировали свой broadcastReceiver и service в манифесте?

4. Я только что зарегистрировал широковещательный приемник, как вы можете видеть (отредактировано). Должен ли я также зарегистрировать обе службы?

5. Да, сервис также должен быть там

Ответ №1:

Ваше устройство не позволит вам запускать будильник, поскольку ему необходимо сэкономить заряд батареи. Итак, перейдите в НАСТРОЙКИ -> Батарея / энергосбережение-> Приложения, затем выберите свое приложение, после чего выберите «без ограничений»

Комментарии:

1. в любом случае, чтобы перенаправить на эти настройки через приложение, потому что я хочу это программно

Ответ №2:

Ваш AndroidManifest.xml должен быть таким:

 <receiver android:name=".ReminderAlarmManager">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service android:name=".OrderReminderNotificationService "/>
  

Комментарии:

1. Еще один вопрос. Сообщая о выполнении приемника в BOOT_COMPLETED, я понимаю, что он будет запущен при загрузке устройства. Но я хотел бы подать сигнал тревоги в определенное время, переданное диспетчеру сигналов тревоги, даже если приложение закрыто? Это должно работать именно так, верно?

2. Все сигналы тревоги удаляются при выключении телефона. Таким образом, у нас есть BOOT_COMPLETED действие, которое система отправляет всем получателям, у которых оно есть в их intenr-фильтре. Вот как мы узнаем, что система была перезагружена, и нам нужно сбросить сигналы тревоги. Однако, если вы не заботитесь об удалении сигналов тревоги после перезагрузки, то вам не нужен intent-filter with BOOT_COMPLETED . Ваши сигналы тревоги будут срабатывать, даже если приложение было закрыто

3. 2021 Это больше не работает. AlarmManager не сработает, если приложение закрыто!

Ответ №3:

Диспетчер оповещений не запускает службы Intent на определенных телефонах. Я тестировал приложение на Oneplus 3T весь день, прежде чем понял, что с кодом все в порядке. Только что протестировал то же приложение на Moto G, и оно работает так, как ожидалось.

Комментарии:

1. 2021 Это смешно, уведомления gmail работают нормально!

2. @user1034912 это совершенно смешно, да, причина, по которой он отлично работает в gmail, потому что они уже занесены в белый список в системе для выполнения обычным способом, но когда дело доходит до приложения, которое создают разработчики, это нет, нет, они заставляют нас бороться в поисках обходных путей ..