Расписание уведомлений не сработало - PullRequest
0 голосов
/ 15 августа 2011

У меня есть приложение, которое я хочу, чтобы оно запускало уведомление каждые x дней (предопределено пользователем).Для этого я использую этот код: Класс расширяет приемник вещания:

public class OnAlarmReceiver extends BroadcastReceiver{
    @Override
     public void onReceive(Context context, Intent intent) {


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

        int icon = R.drawable.icon;
        CharSequence tickerText = "Votre vidange approche";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);


        CharSequence contentTitle = "Notification";
        CharSequence contentText = "Vérifier votre kilométrage";
        Intent notificationIntent = new Intent(context, Acceuil.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        final int HELLO_ID = 1;

        mNotificationManager.notify(HELLO_ID, notification);
     }

    }

И эта функция в другом классе для запуска этого предыдущего класса:

public void repeating() {
        AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i=new Intent(context, OnAlarmReceiver.class);
        PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
        mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1800000, pi);

    }

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

Большое спасибо.

1 Ответ

1 голос
/ 15 августа 2011

SystemClock.elapsedRealtime() означает «сейчас» с точностью до миллисекунды, поэтому есть вероятность, что к тому времени, когда он получит шанс на запуск, triggerAtTime пройдет (не уверен, как AlarmManager обрабатывает этот случай). Попробуйте отложить его на несколько секунд, чтобы проверить, правильно ли он работает: SystemClock.elapsedRealtime() + 10 * 1000.

С другой стороны, повторяющиеся сигналы тревоги с большими интервалами (например, в днях) ненадежны: если ваш процесс убит или выдает исключение, или устройство перезагружается, то его сигналы сбрасываются. Один из вариантов (хотя и не на 100% пуленепробиваемый) заключается в том, чтобы планировать каждый следующий сигнал тревоги из предыдущего и экономить время, например, для общих настроек. Затем каждый раз, когда ваше приложение запускается, проверяйте, является ли следующее время выполнения действительным (то есть, в будущем), и если нет, запланируйте новый сигнал тревоги.

...