针对我的解决方案进行编辑:我正在使用Spinner下拉列表来设置警报时间,却忘记了Spinner的onSelectItem
方法始终认为自己处于选中状态,因此将警报放入该方法中,它不断开火。 OP下方
我正在尝试建立每日通知系统。我使用AlarmManager
在给定的时间推送通知,并且根据文档,我使用的方法应该只发出一次警报。但是,警报会反复发出,直到我完全杀死了该应用程序。
这是我的初始化资料:
alarmMgr = (AlarmManager)MainActivity.this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
alarmInfo = new AlarmManager.AlarmClockInfo(cal.getTimeInMillis(), alarmIntent);
和我的AlarmReceiver
类:
import static com.example.umbrellareminder.MainActivity.location_button;
public class AlarmReceiver extends BroadcastReceiver {
private Context context;
@RequiresApi(api = Build.VERSION_CODES.O)
public void onReceive(Context context, Intent intent) {
this.context = context;
location_button.performClick();
}
}
({location_button
是我用来运行http请求并推送通知的内容)
现在实际上要发出警报了,我已经尝试了
alarmMgr.setAlarmClock(alarmInfo,alarmIntent);
和
alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),alarmIntent);
但是,它们都反复运行。我还尝试添加一个包含alarmIntent.cancel()
的延迟,该延迟确实会取消警报,但是会在警报完全触发之前取消警报(这令人困惑,以为会在延迟之后执行此操作)< / p>
那么我是否有任何原因想念为什么这个警报反复触发?
编辑以添加其他信息:我有一个按钮,用于发出http请求/获取一些要显示并用于通知的信息。警报本身设置在Spinner
中的onItemSelectedListener
(下拉列表是警报的可选时间的列表)中,如下所示:
Spinner time_list = findViewById(R.id.time_list);
time_list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
remind_time = time_list.getSelectedItem().toString();
int hour = Integer.parseInt(Character.toString(remind_time.charAt(0)));
int minute = Integer.parseInt(remind_time.substring(2,3));
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 25);
cal.set(Calendar.SECOND, 45);
if(cal.getTimeInMillis() <= System.currentTimeMillis()){
cal.add(Calendar.DAY_OF_MONTH, 1);
}
Log.d("TIME",cal.getTime().toString());
alarmInfo = new AlarmManager.AlarmClockInfo(cal.getTimeInMillis(), alarmIntent);
//line where I set the alarm
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY,alarmIntent);
}