Напоминание в Android не повторяется

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

Ниже приводится интерфейс:

При нажатии "Сохранить изменения" он будет вызываться методом scheduleAlarm на каждый выбранный день:

private void scheduleAlarm(int dayOfWeek) {
    Intent myIntent = new Intent(this , NotifyService.class);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);

    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

    if (dayOfWeek == 0)
        alarmManager.cancel(pendingIntent);
    else {
        Calendar calendar = Calendar.getInstance();
        String time_str[] = reminder_time.getText().toString().split(":");
        calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time_str[0]));
        calendar.set(Calendar.MINUTE, Integer.parseInt(time_str[1]));
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        Long time = calendar.getTimeInMillis();
        Long weekly = AlarmManager.INTERVAL_HOUR / 12; //AlarmManager.INTERVAL_DAY * 7;

        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, weekly, pendingIntent);
    }
}

Как вы можете видеть в этой версии, я пытался повторять сигнал тревоги каждые 5 минут (Long weekly = AlarmManager.INTERVAL_HOUR / 12;)

Служба уведомлений, вызываемая при срабатывании будильника, выглядит следующим образом:

public class NotifyService extends Service {
public NotifyService() {
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    //TODO do something useful
    return Service.START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    Intent intent = new Intent(this , Splash.class);
    intent.putExtra(getString(R.string.NOTIFICATION), true);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon_ensafe);
    long[] pattern = {500,500,500,500,500,500,500,500,500};

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setContentTitle(getString(R.string.reminder))
            .setContentText(getString(R.string.reminder_body))
            .setLargeIcon(bm)
            .setSmallIcon(R.drawable.notification_icon_ensafe)
            .setContentIntent(contentIntent)
            .setAutoCancel(true)
            .setVibrate(pattern)
            .setStyle(new NotificationCompat.InboxStyle())
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI);

    NotificationManager notificationManager  = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(1, mBuilder.build());
}
}

Есть идеи, почему это не работает?

РЕДАКТИРОВАТЬ

Как предложил @Frank, я реализовал BroadcastReceiver, но он никогда не вызывался.

В Манифесте:

<receiver android:name=".synchro.BootReceiver"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

Класс:

public class BootReceiver extends BroadcastReceiver {

List<Integer> selectedDays;
SharedPreferences preferences;

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {

        **\\ STUFF HAPPENS HERE \\ **

    }
}
}

Вещатель запускается в методе scheduleAlarm, указанном выше:

ComponentName receiver = new ComponentName(getApplicationContext(), BootReceiver.class);
    PackageManager pm = getApplicationContext().getPackageManager();
pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);

Есть еще идеи?

2 ответа

Решение

Если ваше устройство выключается, все запланированные тревоги отменяются ОС. Может ли это быть вашей проблемой?

Чтобы решить эту проблему, вам нужно будет прослушивать запуски устройства с помощью прослушивателя широковещания и снова планировать свои сигналы тревоги, когда поступает широковещательная рассылка устройства.

* РЕДАКТИРОВАТЬ *

Вся необходимая информация находится на этой странице: https://developer.android.com/training/scheduling/alarms.html

Особенно в разделе "Запуск тревоги при загрузке устройства": "По умолчанию все тревоги отменяются при выключении устройства. Чтобы этого не произошло..."

Установка и тестирование занимают немного времени. Не быстро

Хорошо. Я решил проблему.

В классе NotifyService я использовал onCreate() способ перенести будильник. Этот метод вызывается только в первый раз. Только после этого onStartCommand называется. Управляя этими двумя методами, я достиг работающего AlarmAcheduler.

Другие вопросы по тегам