myc_100 2013-08-12 08:54 采纳率: 10%
浏览 1601

从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?

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-12 10:07
    关注

    要在 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 来设置和管理提醒了。

    评论

报告相同问题?

悬赏问题

  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效