我需要安排一个特定的重复警报,这可能发生在一周中的任何一天,几天。它可以是星期一,或者每个工作日,或者只有周末——当然这需要存储在数据库中。
我的问题是,我怎样才能将它存储在数据库中?我想过使用一个包含七个位置的 int 数组,并且根据哪个位置是真实的(或 1),我会假设有这样的警报。
还有其他想法吗?请问有什么建议吗?
提前非常感谢。
我需要安排一个特定的重复警报,这可能发生在一周中的任何一天,几天。它可以是星期一,或者每个工作日,或者只有周末——当然这需要存储在数据库中。
我的问题是,我怎样才能将它存储在数据库中?我想过使用一个包含七个位置的 int 数组,并且根据哪个位置是真实的(或 1),我会假设有这样的警报。
还有其他想法吗?请问有什么建议吗?
提前非常感谢。
您可以存储一个单曲byte
来表示您的一周,并使用按位&
运算从中提取值。位 1 可以代表星期一,位 2 星期二等。您可以使用它来代表所有日期组合,例如:
01100000 - Saturday/Sunday (Weekend)
01110001 - Friday/Saturday/Sunday/Monday (Long weekend)
读取值时,您将使用以下内容:
byte val = 0x71; //01110001
boolean mondayActive = (val & 0x1) == 1;
boolean fridayActive = (val >> 4& 0x1) == 1;
编辑评论
这假设您已经熟悉AlarmManager并且正在寻找一种机制来跟踪您的警报,因为您不能使用单个警报以 OP 描述的方式安排事件。如果您需要在单个任务中模拟 cron,可以查看BuzzBox SDK 之类的东西。
编辑写样本
public static final int MONDAY = 0x01; //00000001
public static final int TUESDAY = 0x02; //00000010
public static final int WEDNESDAY = 0x04; //00000100
public static final int THURSDAY = 0x08; //00001000
public static final int FRIDAY = 0x10; //00010000
public static final int SATURDAY = 0x20; //00100000
public static final int SUNDAY = 0x40; //01000000
//example values to write
int weekend = SATURDAY | SUNDAY; //01100000
int longWeekend = FRIDAY | SATURDAY | SUNDAY | MONDAY; //01110001
//and as per flightplanner's comment, to read
boolean mondayActive = (weekend & MONDAY) == MONDAY; //false
mondayActive = (longWeekend & MONDAY) == MONDAY; //true
跟进 Diego 的回答你通常使用AlarmManager
这个。创建一个意图来唤醒下面AlarmReceiver.class
的BroadcastReceiver
. AlarmManagerintent
在您的dateForAlarm
. dateForAlarm
可以是数据库中的String
“2009-04-14 15:16:45”
当设备重新启动时,您需要重新创建所有警报并使用另一个或相同BroadcastReceiver
的从数据库获取所有 dateForAlarm 并创建警报。
将其放入您的清单中以捕获重新启动信号到您的BroadcastReceiver
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
代码:
Calendar dateForAlarm = "yyyy-MM-dd HH:mm:ss" // example date.."2009-04-14 15:16:45"
Intent intent = new Intent(context, MyBroadcastReceiver.class);
intent.putExtra(WAKE_UP_AND_ALARM_NOW, "value you want to send to MyBroadcastReceiver like "god morning"");
PendingIntent sender = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Get the AlarmManager service
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, dateForAlarm, sender);
AlarmManager提供对系统警报服务的访问。这些允许您安排您的应用程序在将来的某个时间点运行。当警报响起时,系统会广播已为其注册的 Intent,如果目标应用程序尚未运行,则会自动启动它。已注册的闹钟在设备处于睡眠状态时会保留(如果在此期间它们响起,可以选择唤醒设备),但如果关闭并重新启动,则会被清除。
这里有一个教程:Android AlarmManager 教程
除了@JohnMark13 的回答和@noloman 的问题“我将如何修改这些值?”,我想补充一下。
要修改值,您可以使用按位操作符。我将解释不同的情况:
启用一天: 假设您想将星期一添加到闹钟中。取一个数字 0x00000001 并将其与您的当前值(即 a|b)进行或运算。返回的值将启用星期一。根据它们的位位置,可以在剩余的日子里制作类似的掩码。对于周末,使用 0x01100000。
禁用一天: 假设您想从闹钟中删除星期一。取一个数字 0x01111110 并将其与您的当前值(即 a&b)相加。返回的值将禁用星期一。根据它们的位位置,可以在剩余的日子里制作类似的掩码。对于周末,使用 0x00011111。
切换前一天的值: 星期一的掩码是 0x00000001。如果您使用此掩码 (a^b) 对值进行异或运算,它将从该值反转星期一的位,因此根据先前的值添加/删除它。对于周末,掩码将为 0x01100000。
希望有帮助。