从onReceive 方法中设置新的报警器

在数据库(按时间排序)中有一个 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 来设置和管理提醒了。