在数据库(按时间排序)中有一个 reminders 的集合,当程序开启时我就调用 setAlarm。我需要在 onReceive 方法中添加代码来实现下面的任务:
1.从数据库中获取第一个提醒。
2.获得相关提醒的延迟。
3.设置一个新的报警获得下一个提醒。
我创建的 BroadcastReceiver 类:
public class AlarmReceiver extends BroadcastReceiver{
private static final String DEBUG_TAG= "AlarmReceiver";
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Log.d(DEBUG_TAG,"ALARM!!!");
// --mycode--
}
}
Activity 类:
public class AlarmActivity extends Activity {
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
context = getApplicationContext();
}
public void setAlarm(View v){
Intent intent = new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ Delay,pendingIntent);
Log.i("SETTER","Alarm started");
}
public void stopAlarm(View v){
Intent intent = new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
pendingIntent.cancel();
}
}
现在在 --mycode— 这部分,新的延迟将会从数据库中获得,并且会使用这个新的Delay设置新的报警。
如何从 onReceive方法中设置一个新的 AlarmManager?
要在 onReceive 方法中设置一个新的 AlarmManager,您需要完成以下步骤:
从数据库中获取第一个提醒。
获取该提醒的延迟(Delay)。
使用该延迟设置新的 AlarmManager。
代码如下:
public class AlarmReceiver extends BroadcastReceiver{
private static final String DEBUG_TAG= "AlarmReceiver";
public void onReceive(Context arg0, Intent arg1) {
Log.d(DEBUG_TAG,"ALARM!!!");
//获取第一个提醒
Reminder firstReminder = getFirstReminderFromDB();
//获取延迟
long delay = firstReminder.getDelay();
//设置新的AlarmManager
Intent intent = new Intent(arg0,AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(arg0, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) arg0.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ delay, pendingIntent);
}
private Reminder getFirstReminderFromDB() {
//implementation to retrive first reminder from DB
}
}
其中,getFirstReminderFromDB() 方法是从数据库中获取第一个提醒的实现。需要根据你的数据库结构去实现。
需要注意:
AlarmManager.RTC_WAKEUP 表示 AlarmManager 在系统休眠时仍然触发提醒
FLAG_CANCEL_CURRENT 如果 PendingIntent已经存在,它会被取消
使用arg0.getSystemService(ALARM_SERVICE)取得AlarmManager
当 AlarmManager 触发提醒时, onReceive 方法将被调用。在 onReceive 方法中,您需要从数据库中获取下一个提醒并获取其延迟,然后使用该延迟设置新的 AlarmManager。
代码如下:
public class AlarmReceiver extends BroadcastReceiver{
private static final String DEBUG_TAG= "AlarmReceiver";
public void onReceive(Context arg0, Intent arg1) {
Log.d(DEBUG_TAG,"ALARM!!!");
//获取第一个提醒
Reminder firstReminder = getFirstReminderFromDB();
//获取延迟
long delay = firstReminder.getDelay();
//设置新的AlarmManager
Intent intent = new Intent(arg0,AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(arg0, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) arg0.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ delay, pendingIntent);
}
private Reminder getFirstReminderFromDB() {
//implementation to retrive first reminder from DB
}
}
其中,getFirstReminderFromDB() 方法是从数据库中获取第一个提醒的实现。需要根据你的数据库结构去实现。
需要注意的是,每次设置新的 AlarmManager 时,都需要使用新的 PendingIntent。如果使用相同的 PendingIntent,则会导致上一个 AlarmManager 被取消。
还有,如果您使用 AlarmManager.setRepeating() 方法设置重复提醒,则不需要在 onReceive 方法中再次设置 AlarmManager。但是,您需要在 onReceive 方法中处理提醒事件。
在 AlarmActivity 类中, setAlarm() 方法负责设置提醒, stopAlarm() 方法负责取消提醒。
setAlarm() 方法, 使用 AlarmManager.set() 方法设置一次性提醒, 参数 delay 表示提醒延迟的时间。
stopAlarm() 方法,使用 PendingIntent.cancel() 方法取消提醒。
可以在setAlarm 里设置触发 AlarmReceiver 类的 onReceive 方法。
public void setAlarm(View v){
Intent intent = new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ Delay,pendingIntent);
Log.i("SETTER","Alarm started");
}
最后,记得在 Manifest 文件中注册 AlarmReceiver 类。
<receiver android:name=".AlarmReceiver">
</receiver>
这样你就可以使用 AlarmManager 来设置和管理提醒了。