Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:使用AlarmManager设置定期报警_Android_Alarmmanager_Android Pendingintent - Fatal编程技术网

Android:使用AlarmManager设置定期报警

Android:使用AlarmManager设置定期报警,android,alarmmanager,android-pendingintent,Android,Alarmmanager,Android Pendingintent,在我的应用程序中,我需要在数据库中添加一行,同时设置一个警报事件,以便每天在其中一个数据库列中指定的时间重复。我已经有一些代码,但它不会在指定的时间触发报警事件。这是我的密码: public class Add_reminder extends Activity { AlarmManager am; int hours, minutes; REMIND_DB db; Calendar calendar; Cursor cursor; Button

在我的应用程序中,我需要在数据库中添加一行,同时设置一个警报事件,以便每天在其中一个数据库列中指定的时间重复。我已经有一些代码,但它不会在指定的时间触发报警事件。这是我的密码:

public class Add_reminder extends Activity {
    AlarmManager am;
    int hours, minutes;
    REMIND_DB db;
    Calendar calendar;
    Cursor cursor;
    Button button;

    public void onCreate(Bundle savedInstanceState) {
        //The usual code in the beginning of onCreate

        //I load db from extended Application class as global since i use it in more
        //Activities. Ints hours and minutes is set by user interaction

        calendar = Calendar.getInstance();
        am = (AlarmManager) getSystemService(ALARM_SERVICE);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                db.open();
                db.insertReminder( -- parameters for database --);
                cursor = db.getAllReminders();
                cursor.moveToLast();
                calendar.set(Calendar.HOUR, hours);
                calendar.set(Calendar.MINUTE, minutes);
                Intent intent = new Intent(Add_reminder.this, ReminderAlarm.class);
                intent.putExtra("id_of_db_row", cursor.getInt(0));
                PendingIntent pi =  PendingIntent.getActivity(Add_reminder.this,
                    cursor.getInt(0), intent, PendingIntent.FLAG_CANCEL_CURRENT);
                am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    24*3600*1000, pi);
                db.close()
            } 
        });
    }
}
数据库已正确更新,但提醒活动从未在指定时间启动。我不知道会出什么问题。我看到一些示例代码使用BroadcastReceiver,而不是使用PendingEvent启动活动,但这应该也可以,对吗?有人知道会出什么问题吗

我的第二个问题是,当我想从不同的活动中添加或删除一些报警时,我是否需要相同的AlarmManager实例,或者我是否只是在我需要的每个活动中声明另一个AlarmManager


谢谢大家!

您应该使用广播接收器接收警报,然后启动一项实际工作的服务。广播接收器不应该用冗长的操作(如写入数据库)阻塞UI线程。此外,“一天一次”警报可能有问题:如果用户重新启动手机:注册的警报将丢失。您需要:

  • 节省警报运行到(比如)SharedPreferecnes的时间
  • 当手机开机时重新注册您的闹钟(接收开机广播)
  • 不要使用
    setRepeating()
    ,而是让每个警报注册下一个警报
使用较短的测试时间(1或2分钟)也有帮助


至于
AlarmManager
实例,它是一个系统服务,您不需要关心您使用的是什么实例。只需使用
getSystemService()

获取警报,然后启动执行实际工作的服务。广播接收器不应该用冗长的操作(如写入数据库)阻塞UI线程。此外,“一天一次”警报可能有问题:如果用户重新启动手机:注册的警报将丢失。您需要:

  • 节省警报运行到(比如)SharedPreferecnes的时间
  • 当手机开机时重新注册您的闹钟(接收开机广播)
  • 不要使用
    setRepeating()
    ,而是让每个警报注册下一个警报
使用较短的测试时间(1或2分钟)也有帮助


至于
AlarmManager
实例,它是一个系统服务,您不需要关心您使用的是什么实例。只需使用
getSystemService()

就可以了。今天早上当我看手机时,我注意到想要的活动已经开始了!似乎问题出在我为它设定的时间上(我用小时表示24格式,而不是用小时表示12格式,所以提醒在12小时后提醒自己)。我的主活动中有一段代码,在活动启动后只执行一次。我可以使用数据库中的数据在那里重新注册我的警报吗?如果用户只是重新启动应用程序,而不是手机本身,它会取代我的闹钟吗?或者只是复制。谢谢。进展:)不过,让活动突然出现通常是个坏主意。正如我所说,使用广播接收器和服务。如果需要用户交互,请发布通知并让用户启动活动。如果您使用等效的
pendingent
警报将被覆盖,而不是复制。这是一个很大的帮助,谢谢:)我将使用广播接收器,正如您所说,这个计时问题更直接:)为什么不使用setRepeating?启动完成后,警报将被设置,然后在第一次启动后,警报将继续定期重复。今天早上,当我查看手机时,我注意到所需的活动已启动!似乎问题出在我为它设定的时间上(我用小时表示24格式,而不是用小时表示12格式,所以提醒在12小时后提醒自己)。我的主活动中有一段代码,在活动启动后只执行一次。我可以使用数据库中的数据在那里重新注册我的警报吗?如果用户只是重新启动应用程序,而不是手机本身,它会取代我的闹钟吗?或者只是复制。谢谢。进展:)不过,让活动突然出现通常是个坏主意。正如我所说,使用广播接收器和服务。如果需要用户交互,请发布通知并让用户启动活动。如果您使用等效的
pendingent
警报将被覆盖,而不是复制。这是一个很大的帮助,谢谢:)我将使用广播接收器,正如您所说,这个计时问题更直接:)为什么不使用setRepeating?启动完成后,将设置警报,然后在第一次启动后,警报将继续定期重复。