编辑我的解决方案:我正在使用 Spinner 下拉列表来设置警报时间,却忘记onSelectItem
了 Spinner 的方法不断地认为自己被选中,因此通过将警报放在该方法中,它会不断地触发。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()
,这确实取消了警报,但它在警报完全触发之前取消了警报(这令人困惑,本以为它会在时间延迟后这样做)
那么我有什么理由错过这个警报反复触发的原因吗?
编辑以添加其他信息:我有一个按钮,用于发出 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);
}