0

我需要安排一个特定的重复警报,这可能发生在一周中的任何一天,几天。它可以是星期一,或者每个工作日,或者只有周末——当然这需要存储在数据库中。

我的问题是,我怎样才能将它存储在数据库中?我想过使用一个包含七个位置的 int 数组,并且根据哪个位置是真实的(或 1),我会假设有这样的警报。

还有其他想法吗?请问有什么建议吗?

提前非常感谢。

4

4 回答 4

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
于 2013-09-10T08:40:39.273 回答
0

跟进 Diego 的回答你通常使用AlarmManager这个。创建一个意图来唤醒下面AlarmReceiver.classBroadcastReceiver. 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);
于 2013-09-10T09:04:23.387 回答
0

AlarmManager提供对系统警报服务的访问。这些允许您安排您的应用程序在将来的某个时间点运行。当警报响起时,系统会广播已为其注册的 Intent,如果目标应用程序尚未运行,则会自动启动它。已注册的闹钟在设备处于睡眠状态时会保留(如果在此期间它们响起,可以选择唤醒设备),但如果关闭并重新启动,则会被清除。

这里有一个教程:Android AlarmManager 教程

于 2013-09-10T08:39:05.280 回答
0

除了@JohnMark13 的回答和@noloman 的问题“我将如何修改这些值?”,我想补充一下。

要修改值,您可以使用按位操作符。我将解释不同的情况:

启用一天: 假设您想将星期一添加到闹钟中。取一个数字 0x00000001 并将其与您的当前值(即 a|b)进行或运算。返回的值将启用星期一。根据它们的位位置,可以在剩余的日子里制作类似的掩码。对于周末,使用 0x01100000。

禁用一天: 假设您想从闹钟中删除星期一。取一个数字 0x01111110 并将其与您的当前值(即 a&b)相加。返回的值将禁用星期一。根据它们的位位置,可以在剩余的日子里制作类似的掩码。对于周末,使用 0x00011111。

切换前一天的值: 星期一的掩码是 0x00000001。如果您使用此掩码 (a^b) 对值进行异或运算,它将从该值反转星期一的位,因此根据先前的值添加/删除它。对于周末,掩码将为 0x01100000。

希望有帮助。

于 2014-10-09T08:16:03.540 回答