我开发了一个闹钟。 主屏幕会列出所有警报并添加选项以将新警报添加到列表中。 我正在使用警报管理器来触发通知或打开用户屏幕。 用户打开通知屏幕和点击按钮后,返回主屏幕并列出所有警报。
所有已经触发但不会再次触发的警报都标有不同的颜色。 为了识别发出警报,我使用此代码:
How to check if AlarmManager already has an alarm set?
但此代码仅在触发警报30秒后返回false(警报未设置)警报,并在返回主屏幕时立即返回true(警报设置)。
设置闹钟我正在使用此服务:
protected static void SetBackgroudAlrm(long alarmTime, boolean toggleBtnRep,int AlrmID,Context context) {
/** Set Alarm in Background */
AlarmManager manager;
PendingIntent pIntent = null ;
Intent alarmIntent = new Intent(context,AlarmReceiver.class);
pIntent = PendingIntent.getBroadcast(context, AlrmID, alarmIntent, 0);
manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if (toggleBtnRep){ //repeat is on
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,alarmTime ,7 * 24 * 60 * 60 * 1000, pIntent);
} else { //repeat is off
manager.set(AlarmManager.RTC_WAKEUP,alarmTime, pIntent);
}
Toast.makeText(MainActivity.getContext(), "Alarm Set ", Toast.LENGTH_SHORT).show();
//enable automatically resetting alarms when device reboots
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
为了检查是否设置了警报,我使用以下代码:
public static boolean ChkActiveAtrm(int pos){
boolean Rtn = false;
int AlrmID[]=ListViewAdapter.GetAlrmSelectID(MainActivity.AlrmIDStr.get(pos),pos);
for (int i=0;i<AlrmID.length;i++){
boolean alarmUp = (PendingIntent.getBroadcast(MainActivity.getContext(), AlrmID[i],
new Intent(MainActivity.getContext(),AlarmReceiver.class),
PendingIntent.FLAG_NO_CREATE) != null);
if (alarmUp) {Rtn=true;}
} //end for
返回Rtn; }
有没有人发现这种现象? 我可以立即获得警报设置/未设置的指示? 谢谢
答案 0 :(得分:0)
首先,不要仅依靠AlarmManager
来保存和管理警报。有许多情况会清除或延迟警报等。
有一个SQLite表等来正确跟踪警报,以及创建的,计划的和触发的时间戳。
______________________________________________________________________
| id | name | repeating | time | interval | set_at | triggered_at |
______________________________________________________________________
| 0 | abc | 1 | 2394000 | 36000 | 2003900 | 1800094 |
______________________________________________________________________
然后:
实施启动意图接收器以读取此表并为每条记录安排警报。
更新闹钟设置后,请在数据库中更新并重新安排该闹钟。
触发警报时,更新相应数据库记录中的时间戳。