Android中的重复警报

时间:2013-09-10 08:27:53

标签: android android-alarms

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

我的问题是,如何将其存储在数据库中?我想过使用一个包含7个位置的int数组,并且取决于哪个位置是真(或1),我会假设有一种警告。

还有其他想法吗?建议好吗?

提前多多感谢。

4 个答案:

答案 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处触发此dateForAlarmdateForAlarm可以是数据库中的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。

希望有所帮助。