我需要安排一定的重复警报,这可能发生在一周的任何一天,几天。它可以是星期一,或每个工作日,或只是周末 - 当然这需要存储在数据库中。
我的问题是,如何将其存储在数据库中?我想过使用一个包含7个位置的int数组,并且取决于哪个位置是真(或1),我会假设有一种警告。
还有其他想法吗?建议好吗?
提前多多感谢。
答案 0 :(得分:2)
您可以存储一个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
答案 1 :(得分:0)
AlarmManager 可以访问系统警报服务。这些允许您安排应用程序在将来的某个时间运行。当警报响起时,系统会广播已为其注册的Intent,如果目标应用程序尚未运行,则会自动启动它。设备处于休眠状态时会保留已注册的警报(如果设备在此期间关闭,则可以选择将设备唤醒),但如果设备关闭并重新启动,则会清除设备。
这里有一个教程:Tutorial on Android AlarmManager
答案 2 :(得分:0)
跟进迭戈回答你通常使用AlarmManager
来做到这一点。
创建一个意图,唤醒下面的AlarmReceiver.class
BroadcastReceiver
。
AlarmManager在intent
处触发此dateForAlarm
。 dateForAlarm
可以是数据库中的String
,如“2009-04-14 15:16:45”
当设备重新启动时,您需要重新创建所有警报并使用另一个或相同的BroadcastReceiver
来从DB获取所有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);
答案 3 :(得分:0)
除了@ JohnMark13的回答和@noloman的问题“我将如何修改值?”之外,我想补充一下。
要修改值,可以使用按位操作。我会解释不同的情况:
启用一天: 假设您要将星期一添加到警报中。取一个数字0x00000001并将其与当前值(即a | b)进行或运算。返回的值将启用星期一。根据其钻头位置,可以在其余时间制作类似的面罩。对于周末,请使用0x01100000。
要停用一天: 假设您要从警报中删除星期一。取一个数字0x01111110并将其与当前值(即a&amp; b)进行对比。返回的值将禁用星期一。根据其钻头位置,可以在其余时间制作类似的面罩。对于周末,请使用0x00011111。
切换一天的上一个值: 星期一的掩码是0x00000001。如果使用此掩码(a ^ b)对值进行异或,它将从该值反转星期一的位,因此根据先前的值添加/删除它。对于周末,掩码将为0x01100000。
希望有所帮助。