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>

Но ничего не появляется ... Что я делаю не так?


person Hubert Solecki    schedule 11.10.2016    source источник
comment
Вы звоните в службу поддержки из BroadcastReceiver?   -  person Marat    schedule 11.10.2016
comment
Я отредактировал свой пост с полным кодом. Я разместил BroadCastreceiver и завершил настройку AlarmManager. Должен ли я сделать что-то подобное в манифесте на BOOT_COMPLETED?   -  person Hubert Solecki    schedule 11.10.2016
comment
ваш файл манифеста тоже нужен. Я имею в виду, вы зарегистрировали свои broadcastReceiver и service в Манифесте?   -  person Marat    schedule 11.10.2016
comment
Я только что зарегистрировал широковещательный приемник, как вы видите (отредактировано). Следует ли мне также зарегистрировать обе службы?   -  person Hubert Solecki    schedule 11.10.2016
comment
Да, сервис тоже должен быть там   -  person Marat    schedule 11.10.2016


Ответы (3)


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

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

<service android:name=".OrderReminderNotificationService "/>
person Marat    schedule 11.10.2016
comment
Еще один вопрос. Сообщая выполнить приемник на BOOT_COMPLETED, я понимаю, что он будет запущен, когда устройство загрузится. Но я бы хотел активировать тревогу через определенное время, прошедшее для диспетчера тревог, даже если приложение закрыто? Это должно работать так, верно? - person Hubert Solecki; 11.10.2016
comment
Все будильники удаляются при выключении телефона. Следовательно, у нас есть BOOT_COMPLETED действие, которое система отправляет всем получателям, у которых оно есть в их внутреннем фильтре. Вот как мы узнаем, что система была перезагружена, и нам нужно сбросить сигналы тревоги. Однако, если вы не заботитесь об удалении сигналов тревоги после перезагрузки, тогда вам не нужен фильтр намерений с BOOT_COMPLETED. Ваши будильники будут активированы, даже если приложение было закрыто - person Marat; 11.10.2016

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

person Trouble Maker    schedule 03.10.2020
comment
в любом случае перенаправить на эти настройки через приложение, потому что я хочу, чтобы это было программно - person Gaurav Roy; 18.06.2021

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

person Anish Sekar    schedule 02.07.2017