Есть ли способ запланировать конец повторяющейся тревоги в Android? - PullRequest
1 голос
/ 03 марта 2020

Я довольно новичок в разработке Android, и я решил создать приложение с повторяющимися тревогами, в котором вы можете выбрать, когда закончится цикл, например, после 5 всплесков тревоги. Я установил будильник и все, у меня есть кнопка для отмены будильника, но я не могу ограничить его, поэтому он автоматически останавливается после указанного количества срабатываний будильника. Есть ли способ сделать это? Я хочу, чтобы в окне EditText можно было записать, сколько пакетов я хочу, записать задержку между аварийными сигналами, а затем нажать кнопку, чтобы установить ее.

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;
    private Double delay;
    private int howManyTimes;
    private EditText remaining;
    private EditText iterator;

Я хочу сохранить количество пакеты в howManyTimes.

My OnClickListener выглядит следующим образом (итератор - это EditText, где я записываю количество пакетов, а оставшиеся - EditText, где я записываю задержку между пакетами):

public void onClick(View v) {
    if (remaining.getText().toString().equals("") || remaining.getText().toString().equals(".")) {
        delay = 0.0;
    } else {
        delay = (60 * 60 * 1000) * Double.parseDouble(remaining.getText().toString());
    }
    if (iterator.getText().toString().equals("") || iterator.getText().toString().equals(".")) {
        howManyTimes = 0;
    } else {
        howManyTimes = Integer.parseInt(iterator.getText().toString());
    }
    if (howManyTimes > 0) {
        double tmpDelay = delay;
        int tmpIterator = howManyTimes;
        updateTimeText(tmpIterator, tmpDelay);
        startAlarm();
    }
}

startAlarm() выглядит так:

private void startAlarm() {
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlertReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);


    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + delay.longValue(),
            delay.longValue(), pendingIntent);
}

это мой приемник вещания:

    public class AlertReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationHelper notificationHelper = new NotificationHelper(context);
        NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
        notificationHelper.getManager().notify(1, nb.build());

    }
}

1 Ответ

1 голос
/ 03 марта 2020

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

, здесь вы сохраните количество раз var для общих префер и сбросите счетчик прошедших до нуля.

public void onClick(View v) {
    if (remaining.getText().toString().equals("") || remaining.getText().toString().equals(".")) {
        delay = 0.0;
    } else {
        delay = (60 * 60 * 1000) * Double.parseDouble(remaining.getText().toString());
    }
    if (iterator.getText().toString().equals("") || iterator.getText().toString().equals(".")) {
        howManyTimes = 0;
    } else {
        howManyTimes = Integer.parseInt(iterator.getText().toString());
        //here you store the amount of desired bursts to persistent memory and reset elapsed bursts to 0
        SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor=sharedPreferences.edit();
            editor.putInt("desiredBursts",howManyTimes);
            editor.putInt("elapseddBursts",0);
            editor.apply();
    }
    if (howManyTimes > 0) {
        double tmpDelay = delay;
        int tmpIterator = howManyTimes;
        updateTimeText(tmpIterator, tmpDelay);
        startAlarm();
    }
}

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

//this goes in your broadcastreceiver
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(context);
int desiredBursts = sharedPreferences.getInt("desiredBursts", 1);//this will get the desired bursts
int elapsedBursts = sharedPreferences.getInt("elapsedBursts", 0);//this will get the running burst count
if(desiredBursts>elapsedBursts){
    SharedPreferences.Editor editor=sharedPreferences.edit();
    editor.putInt("elapsedBursts",elapsedBursts+1);
    editor.apply();
    //play actual alarmsound here either with soundpool or mediaplayer
}else{
    //cancel the alarm here
}
...