Использование setExact () в широковещательном приемнике для повторения - PullRequest
0 голосов
/ 10 мая 2018

Сценарий: Работники производственной линии проводят проверки через определенные промежутки времени. В моем приложении пользователь вводит этот интервал времени в текстовое поле. Есть дата и время выбора, так что пользователь может выбрать, когда процесс начался. Я пытаюсь включить будильник за 5 минут до следующей проверки.

Например: Процесс начинается в 2.30. Пользователь вошел с интервалом в 20 минут. Поэтому следующая проверка должна быть в 2,50. Тревога должна звучать в 2.45. Затем этот процесс повторится, поэтому следующая проверка будет 3.10, а сигнал тревоги должен прозвучать в 3.05.

Вот код, который у меня есть:

 MainActivity.calculate();
        commencedTime = new Date();
        mTime = Calendar.getInstance();
        mTime.setTime(alarmTime);
        timeCommenced = trimSecsAndMillisecs(mTime).getTimeInMillis();

        currentTime = new Date();
        currentTime.getTime();

        alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
        //set alert
        alertDialogBuilder
                .setTitle("IP Check frequency: " + time.getText() + " minutes")
                .setMessage("Processing commenced at \n" + startTime.getText())
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        if (currentTime.after(alarmTime)) {
                            Toast.makeText(MainActivity.this, "Missed first alert", Toast.LENGTH_LONG).show();
                        }

                        i = Integer.parseInt(time.getText().toString());
                        long scTime2 = ((i * 60 * 1000)); //TIME ENTERED IN MILLISECONDS

                        intent1 = new Intent(MainActivity.this, MyBroadcastReceiver.class);
                        intent1.putExtra("timeEntered", scTime2);
                        intent1.putExtra("timeCommenced", timeCommenced);
                        sendBroadcast(intent1);

                        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

                        manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        manager.setExact(AlarmManager.RTC_WAKEUP, timeCommenced, pendingIntent);

                        Toast.makeText(MainActivity.this, "Alert Set", Toast.LENGTH_SHORT).show();
                        stopped.setVisibility(View.VISIBLE);
                        commenced1.setVisibility(View.GONE);

                        //Change editText to TextView
                        time.setVisibility(View.GONE);
                        timeText.setVisibility(View.VISIBLE);
                        timeText.setText(time.getText().toString());
                        processingText.setText(R.string.processing_commenced);

                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        alertDialog = alertDialogBuilder.create();
        alertDialog.show();

    }
}

Приемник вещания:

@Override
public void onReceive(Context context, Intent intent) {
    // Vibrate the mobile phone
    vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    long[] pattern = {0, 10000, 3, 10000};
    vibrator.vibrate(pattern, -1); // vibration for 20 seconds

    //create as instance of the media player
    mediaPlayer = MediaPlayer.create(context, R.raw.alarm_sound);
    mediaPlayer.start();

   createNotification(context, "AlmaIPC", "IP check is due", "Alert");

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    Intent intent2 = new Intent(context, MainActivity.class);
    PendingIntent pi2 = PendingIntent.getActivity(context, 0, intent2, 0);

    Long timeEntered =intent.getLongExtra("timeEntered", 0);


    AlarmManager.AlarmClockInfo ac=
            new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + timeEntered,
                    pi2);

    manager.setAlarmClock(ac, pi);


}

переменная timecommenced, которая есть в моих параметрах setExact (), правильно отлаживается, в какое время она должна активировать тревогу.

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

По какой-то причине я нажимаю «Обработка началась» вместо звукового сигнала тревоги, когда timecommenced сообщает, что он срабатывает сразу. Затем, после этого, время срабатывания будильника полностью отключилось, и у него появился собственный разум.

Может кто-нибудь увидеть что-то, что я делаю неправильно или дать мне какой-нибудь совет?

Спасибо!

1 Ответ

0 голосов
/ 10 мая 2018

«setExact» не работает, как следует из названия на Android 6+ [API 21+].Он будет подвергаться ограничениям на дрему примерно, когда устройство не заряжается, а экран выключен.[Примечание: проблема является более острой, начиная с Android 7, поскольку она имеет гораздо более агрессивную форму Doze]

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

AlarmManager am =
  (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent1 = new Intent(context, myReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
Intent intent2 = new Intent(context, myActivity.class);
PendingIntent pi2 = PendingIntent.getActivity(context, 0, i2, 0);

AlarmManager.AlarmClockInfo ac=
  new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + DELAY,
    pi2);

am.setAlarmClock(ac, pi);

Из документов:

добавлен setAlarmClock на уровне API 21

void setAlarmClock (AlarmManager.AlarmClockInfo info, 
            PendingIntent operation)

Расписание будильника, представляющего будильник, который будет использоваться для уведомления пользователякогда это уходит.Ожидается, что при срабатывании этого будильника приложение еще раз разбудит устройство, чтобы сообщить пользователю о будильнике - включении экрана, воспроизведении звука, вибрации и т. Д. Таким образом, система обычно также использует информациюпредоставляется здесь, чтобы сообщить пользователю об этом предстоящем аварийном сигнале, если это необходимо.

Из-за характера этого типа аварийного сигнала, аналогичного setExactAndAllowWhileIdle (int, long, PendingIntent), эти аварийные сигналы будут разрешены, даже еслиСистема находится в режиме ожидания с низким энергопотреблением (он же режим ожидания)

Документы диспетчера тревог

Чтобы установить более 1 тревоги, присвойте каждому уникальный код запроса вPendingIntent:

 static PendingIntent   getBroadcast(Context context, int requestCode, Intent intent, int flags)
...