Android 在特定时间执行代码:处理程序?报警管理器?
我需要每隔一段时间执行代码,有时10秒,有时5分钟。代码应在启动后10秒执行,然后在启动后5分10秒执行,以此类推。Android 在特定时间执行代码:处理程序?报警管理器?,android,handler,alarmmanager,Android,Handler,Alarmmanager,我需要每隔一段时间执行代码,有时10秒,有时5分钟。代码应在启动后10秒执行,然后在启动后5分10秒执行,以此类推。 计时器从一开始就在滴答作响,因此执行时间必须准确 使用Handler.postDelayed不起作用,因为要执行的代码可能需要一些时间。发生这种情况时,代码的下一次执行可能会延迟 当我想实现AlarmManager时,我看到了注释 报警管理器适用于您希望 应用程序代码在特定时间运行,即使您的应用程序 当前未运行。对于正常计时操作(滴答声、超时、, 等等)使用Handler更容易、
计时器从一开始就在滴答作响,因此执行时间必须准确 使用
Handler.postDelayed
不起作用,因为要执行的代码可能需要一些时间。发生这种情况时,代码的下一次执行可能会延迟
当我想实现AlarmManager
时,我看到了注释
报警管理器适用于您希望
应用程序代码在特定时间运行,即使您的应用程序
当前未运行。对于正常计时操作(滴答声、超时、,
等等)使用Handler更容易、更高效
所以我有点困惑,我应该怎样做才能保证正确的执行呢?看看这篇文章:。您可以使用setRepeating()方法,或者在每次执行后再次设置计时器。请查看以下文章:。您可以使用setRepeating()方法,或者在每次执行后再次设置计时器。我建议您使用postDelay,对于任何post-to处理程序,处理程序打开新线程,代码同时执行
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
//some code
mHandler.postDelayed(this, 1000);
}
};
以下是我使用postDelay显示倒计时的完整代码:
在这里,我还使用AlarmManger,但仅作为在应用程序关闭时在通知栏上显示消息的余数。我建议您使用postDelay,对于任何post-to处理程序,处理程序正在打开新线程,代码同时执行
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
//some code
mHandler.postDelayed(this, 1000);
}
};
以下是我使用postDelay显示倒计时的完整代码:
在这里,我还使用AlarmManger,但仅作为关闭应用程序时在通知栏上显示消息的余数。由于android不是一个硬实时操作系统,如果没有实质性的内核修改,就不可能精确地执行时间。即使这样,在一个典型的android设备上,你也不太可能有很多有用的I/O的精确计时方式,所以仅仅在完美的时间运行你的代码可能是不够的 您最多可以使用更可靠的计时器来确定代码可能运行的最新时间点,并采取事后补偿措施
就可用的计时方法而言,一个主要考虑因素是,如果您打算让设备从睡眠中醒来以完成事件,在这种情况下,您应该使用报警管理器,如果您打算让设备保持清醒,在这种情况下,您应该使用唤醒锁,或者,如果您认为只有当设备处于唤醒状态且您的服务或活动正在运行时才会发生事件,那么您可以使用简单的计时器。由于android不是一个硬实时操作系统,如果不进行实质性的内核修改,则无法精确执行时间。即使这样,在一个典型的android设备上,你也不太可能有很多有用的I/O的精确计时方式,所以仅仅在完美的时间运行你的代码可能是不够的 您最多可以使用更可靠的计时器来确定代码可能运行的最新时间点,并采取事后补偿措施
就可用的计时方法而言,一个主要考虑因素是,如果您打算让设备从睡眠中醒来以完成事件,在这种情况下,您应该使用报警管理器,如果您打算让设备保持清醒,在这种情况下,您应该使用唤醒锁,或者,如果您认为只有当设备处于唤醒状态且您的服务或活动正在运行时才会发生事件,那么在这种情况下,您可以使用简单的计时器。正如Chris所说,Android中没有精确的计时 但你可以像这样尝试接近实时 等待5s的一些伪代码:
class mJob implements Runnable{
public void run(){
while(System.currentTimeMillis()<myExactTime){ //poll for your time
Thread.sleep(1);
}
//Ok, we are as near as we'll ever get
//call here your 'realtime' function or whatever you need
}
}
mHandler.postDelayed(mJob,4950); //the closer to 5000, the better for the cpu but you could miss your `myExactTime`
类mJob实现可运行{
公开募捐{
正如Chris所说,(System.currentTimeMillis()),Android中没有精确的计时
但你可以像这样尝试接近实时
等待5s的一些伪代码:
class mJob implements Runnable{
public void run(){
while(System.currentTimeMillis()<myExactTime){ //poll for your time
Thread.sleep(1);
}
//Ok, we are as near as we'll ever get
//call here your 'realtime' function or whatever you need
}
}
mHandler.postDelayed(mJob,4950); //the closer to 5000, the better for the cpu but you could miss your `myExactTime`
类mJob实现可运行{
公开募捐{
while(System.currentTimeMillis()您没有指定代码是在应用程序运行时运行还是作为后台服务运行。这很重要,因为锁定设备后,Android将进入睡眠模式,CPU关闭,postDelayed等功能将不会被激活。您还打算请求启动活动。
但AlarmManager广播将。
我将引用
AlarmManager最适合用于需要
即使应用程序未打开也要运行。对于正常计时操作
需要在应用程序使用期间运行的(滴答声、超时等),它是
更有效地使用
AlarmManager需要太多的开销来证明它的合理性
这样使用
您没有指定代码是在应用程序运行时运行还是作为后台服务运行。这一点很重要,因为在您锁定设备后,Android将进入睡眠模式,CPU关闭,postDelayed等功能将不会激活。您还打算要求启动活动。
但AlarmManager广播将。
我将引用
AlarmManager最适合用于需要
即使应用程序未打开也要运行。对于正常计时操作
需要在应用程序使用期间运行的(滴答声、超时等),它是
更有效地使用
AlarmManager需要太多的开销来证明它的合理性
这样使用