Что лучше всего использовать, так как SetRepeating () не работает после 19 API - PullRequest
0 голосов
/ 08 мая 2018

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

Ее приложение вернулось ко мне, так как у будильника свой собственный разум, и он был непоследователен. Вот код, который она использует:

 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();
                        }
                        intent1 = new Intent(MainActivity.this, MyBroadcastReceiver.class);

                        i = Integer.parseInt(time.getText().toString());
                        scTime2 = (i * 60 * 1000); //5 minutes before set time

                        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
                        manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        manager.setRepeating(AlarmManager.RTC_WAKEUP, timeCommenced, scTime2, 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();

    }
}

Я вижу, что она использует SetRepeating(), и я прочитал, что с 19 уровня API плюс это может быть проблемой.

Я пытался использовать SetExact(), но я получил красную линию под переменными внутри метода.

Кто-нибудь сможет сказать мне, как я могу сохранить переменные, но получить согласованность?

Спасибо!

Ответы [ 2 ]

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

Вы правы. согласно https://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int,%20long,%20long,%20android.app.PendingIntent)

Примечание. Начиная с API 19 все повторяющиеся сигналы тревоги неточны. Если твой приложению нужно точное время доставки, тогда оно должно использоваться один раз точные тревоги, перепланирование каждый раз, как описано выше. наследие приложения, у которых targetSdkVersion ранее API 19, будут продолжать иметь все свои тревоги, в том числе повторяющиеся тревоги, рассматривается как точный.

они рекомендуют вам использовать set () вместо setRepeating () , который будет срабатывать один раз. после срабатывания тревоги снова вызовите set () внутри обработчика или pendingIntent.

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

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

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

Если вы используете setRepeating, ОС может / будет отсрочивать время запуска до времени, когда она может инициировать несколько аварийных сигналов вместе для экономии заряда батареи.

...