java - 有没有办法在 Android 中安排重复警报的结束?
问题描述
我对 Android 开发很陌生,我决定创建一个重复警报应用程序,您可以在其中选择循环结束的时间,比如在 5 次警报爆发后。我已经设置了警报和所有这些,我有一个按钮可以取消警报,但我无法限制它,所以它会在所述警报爆发后自动停止。有没有办法做到这一点?我希望能够在EditText
窗口中写下我想要多少次爆发,写下警报之间的延迟,然后按下按钮进行设置。
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private Double delay;
private int howManyTimes;
private EditText remaining;
private EditText iterator;
我想将爆发的数量存储在howManyTimes
.
我的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());
}
}
解决方案
我认为实现它的一种方法是将所需的突发数量以及到目前为止已经过去的突发数量存储在持久内存中,即在您的应用程序偏好中。这样,即使您在警报之间关闭应用程序,信息也会持续存在。然后只需添加一个 if 语句并在经过的突发量等于所需的总突发量时取消警报。稍后将添加一些代码。
在这里,您将多少次 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
}
推荐阅读
- wordpress - 类别未显示在自定义帖子类型中
- javascript - 如何在 .js 中延迟下一个 PHP 调用,直到之前的 PHP 调用返回答案?
- javascript - 使用 addEventListener 或其他方法在 onclick 事件上首先调用 Javascript 定义函数
- mysql - 加入的前 5 个值(点击次数较多)
- xcode - 使用 SwiftUI 实时更新旋钮
- javascript - 如何更改输入文本的值?
- node.js - 套接字服务器中的主机名
- android - 评估根项目“firebase_auth”时出现问题。> 找不到 firebase_core FlutterFire 插件
- f# - 这是在 F# 中对 Seq.cache 的一个很好的使用吗?
- python-3.x - 如何确保2个数字不重复