Ошибка AlarmManager при сбросе / отмене тревоги при изменении даты и времени - PullRequest
5 голосов
/ 03 февраля 2012

Я хочу отправлять данные на сервер с интервалом regular. Итак, я использую AlarmManager для того же. Работает нормально, но проблема в том, что когда я cancel Аварийный сигнал на Date/Time меняется. В это время Alarm срабатывает снова перед отменой, поэтому мое приложение ухудшается, поскольку данные extra отправляются на server с интервалом irregular.

Вот мой BroadCastReceiver класс с AlarmManager.

 public class MyReceiver extends BroadcastReceiver{

    AlarmManager mgr;
    PendingIntent pi;
    Intent intent;
    public static boolean flag = false;

    @Override
    public void onReceive(final Context arg0, Intent arg1) {

        if(arg1.getAction().equals("android.intent.action.TIME_SET")){
            Log.d("MyReceiver", "Time set");

            mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE);
            intent = new Intent(arg0, TestService.class);
            intent.putExtra("test", "testvalue");
            pi = PendingIntent.getService(arg0, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

            if(!flag){
                mgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, 5000, pi);
                flag = true;
            }
            else{
                mgr.cancel(pi);
                pi.cancel();
                flag = false;
            }
        }
    }
}

Ниже приведен снимок экрана с выходом Logcat, который объясняет, что после отмены будильника он срабатывает еще раз сразу после отмены.

enter image description here

Как вы можете видеть на выходе Logcat, black arrow показывает, где я изменил это время для отмены будильника, а red arrow показывает, что после повторной отмены будильника он сработал непосредственно перед отменой, что не должно происходить. Итак, может ли кто-нибудь дать мне представление о том, почему это происходит и что я должен сделать, чтобы restrict Тревога снова сработала перед отменой.

ПРИМЕЧАНИЕ: - Это происходит только тогда, когда я пытался увеличить дату / время, скажем, с 10:00 до 11:00, работает отлично, когда я уменьшаю время, скажем, с 10:00 до 9: 00.

Ответы [ 4 ]

0 голосов
/ 12 апреля 2013

Я не понимаю, зачем устанавливать получателя для изменения даты, если ваша цель - отправлять данные на сервер только через определенный промежуток времени.

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

0 голосов
/ 01 июня 2012

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

установив ожидающее намерение в действии

PendingIntent.getBroadcast(это, код , намерение, PendingIntent.FLAG_UPDATE_CURRENT);

для остановки этого получателя широковещания

PendingIntent pendingIntent = PendingIntent.getBroadcast (getBaseContext (getBaseContext (), код , намерение, 0);AlarmManager alarmManager = (AlarmManager) getSystemService (Context.ALARM_SERVICE);alarmManager.cancel (pendingIntent);

0 голосов
/ 26 июня 2012

почему это происходит

Во-первых, вы используете Намеренное действие android.intent.action.TIME_SET, так что это означает, что Каждый раз, как при изменении системной даты / времени ваш BroadcastReceiver будет называться автоматически.

Во-вторых, вы использовали один static boolean flag в вашем Receiver классе. Теперь происходит то, что происходит. Всякий раз, когда вы изменяете системные настройки, флаг переключает свое состояние с false to true и с true to false.

.

Это именно то, что происходит в вашем коде, и logcat также показывает, что все работает согласно написанному коду.

Итак, по моему мнению, ничего Неправильно происходит в коде и его выводе.

what should I do to restrict Alarm getting fired again before cancelling

Во-первых, как я думаю, вы не должны использовать Action TIME_SET для включения / выключения флага , поскольку пользователи и разработчики могут не помнить для того, что они изменяют время включения или выключения FLAG,

Лучше всего будет , вы должны сами обрабатывать Сервис с помощью Деятельности и показывать там одну ToggleButton для управления состоянием FLAG, а также устанавливать и отменять PendingIntent.

OR И если вы хотите выполнить задачу вашего сервиса автоматически, тогда вы просто используете AlarmManager и задаете там время срабатывания сигнализации и интервал только один раз, скажем, время является текущим, а интервал - 50000 миллисекунд.

, поэтому он, очевидно, будет вызывать службу с этого момента через каждые 5 минут, а затем в вашем приложении вам потребуется только одна кнопка ToggelButton, чтобы указать, что синхронизация с сервером включена или выключена , если пользователь включил ее или выключите , напишите свой код AlarmManager в вашей деятельности только в toggleButtontb.setOnCheckedChangeListener(listener), я полагаю, это лучший способ , чем то, что вы на самом деле реализуете.

0 голосов
/ 04 апреля 2012

Не могу увидеть LogCat с моей стороны, но, глядя на код, я не уверен, как убивается / останавливается служба, которая вызывается (TestService)?Я думаю, вам нужно как-то это остановить.Кроме того, не рекомендуется выполнять длительные задачи в приемнике вещания.Вы убедились, что событие остановки службы происходит после запуска mgr.cancel (pi)?

...