手机休眠被唤醒后timer还继续执行吗

本文介绍了在Android系统中实现待机状态下的定时任务方法。详细对比了Handler、Timer、Thread等常规方法在待机时的表现,并重点介绍了使用AlarmManager的不同模式(如RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP)来确保应用在设备待机时仍能执行预定操作。

转自:https://zhidao.baidu.com/question/1383642695464417020.html

前段时间在工作的时候碰见一个问题,就是要待机时在设定的时间内执行操作,开始并没有意识到问题的严重,后来尝试很多办法没有成功,最后也是在网上找到解决办法,在此稍作总结,希望能对大家有所帮助,不足之处还望大家指正。
1Android中的handler、timer、thread、在待机时都会停止运行,所设定的时间会在待机结束后继续计算。所以如果想在Android待机时运行某些操作,使用以上几种方法是不可行的。
2Android中有一个Alarmmanager对象,可以使用该对象执行待机时的操作。具体设置的方法如下:
2.1设置闹铃的类型
AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.POWER_OFF_WAKEUP:能唤醒系统,他是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称为关机闹铃。
RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。
2.2设置闹铃的开始时间
如果使用ELAPSED_REALTIME或者ELAPSED_REALTIME_WAKEUP类型应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间
如果使用RTC或者RTC_WAKEUP类型应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间
2.3pendingintent
一个PendingIntent对象,表示到时间后要执行的操作。PendingIntent与Intent类似,可以封装Activity、BroadcastReceiver和Service。
但与Intent不同的是,PendingIntent可以脱离应用程序而存在。

接触Android没几天,不太了解。
本来写好的一个应用在无意中发现,待机的时候,应用中的一个线程停止了运行。
这个线程是每隔一分钟上传一个数据到服务器上。
我当时测试的时候,没想过待机(接开关键)下的情况是怎样的,现在发现,只要手机一进入待机状态,这个线程就停止工作了。
不过有一个奇怪的现象,因为我的应用中同时启动了三个线程。
一个负责每隔一分钟上传一个数据,当待机的时候,这个线程暂停运行,当手机不待机的时候,马上复活。
一个负责接收服务器发过来的UDP数据包,这个线程倒是不受待机的影响,当有数据来的时候,可以正常处理。
难道是因为datagramSocket.receive(datagramPacket);阻塞的原因?
public void run()
{
while(true)
{
datagramSocket.receive(datagramPacket); //阻塞
}
}

到网上搜索了一下,看到别人说的:
实验1:使用Java.util.Timer
当连接USB线进行调试时,会发现一切工作正常,每5秒更新一次界面,即使是按下电源键,仍然会5秒触发一次。
当拔掉USB线,按下电源键关闭屏幕后,过一段时间再打开,发现定时器明显没有继续计数,停留在了关闭电源键时的数字。

实验2:使用AlarmService:
2.1通过AlarmService每个5秒发送一个广播,setRepeating时的类型为AlarmManager.ELAPSED_REALTIME。
拔掉USB线,按下电源键,过一段时间再次打开屏幕,发现定时器没有继续计数。
2.2setRepeating是的类型设置为AlarmManager.ELAPSED_REALTIME_WAKEUP
拔掉USB线,按下电源键,过一点时间再次打开屏幕,发现定时器一直在计数。

如此看来,使用WAKEUP才能保证自己想要的定时器一直工作,但是肯定会引起耗电量的增加。

我最后自已写了一个Service类,然后使用AlarmService每隔一分钟执行一次,在待机的时候也能正常运行。

要实现按键唤醒设备后再次进入深度休眠,可参考以下思路和步骤: ### 对于 Linux 系统 在 Linux 系统中,若要实现按键唤醒后再次进入深度休眠,可按照如下步骤操作: 1. **添加中断唤醒源**:在休眠时,需添加中断唤醒源,保证这些中断处于开启状态,当有中断产生时,系统会退出休眠。常见的中断源包含 RTC、按键、USB 等。可通过查看系统支持的睡眠模式,如使用命令 `cat /sys/power/state` ,结果可能显示为 `freeze mem` 等 [^1]。 2. **驱动修改**:依据具体硬件和系统,对驱动进行修改以支持按键唤醒和再次进入深度休眠。 3. **设置唤醒条件**:明确按键触发的中断条件,确保系统能确响应按键操作。 4. **再次进入休眠**:当按键唤醒系统后,在满足特定条件(如一段时间内无操作)时,系统可再次进入深度休眠。 ### 对于单片机系统 以单片机为例,实现按键唤醒后再次进入深度休眠,可按以下流程操作: 1. **休眠前资源关闭**:在进入对应等级的低功耗休眠模式之前,要对相应的资源进行关闭处理,包括但不限于 ADC、Timer、WTD 等。若不关闭这些资源,在休眠时可能会被频繁唤醒 [^2]。 2. **引脚配置**:非休眠唤醒的引脚通常配置成输出低,以减少漏电流,但需根据具体电路做相应调整 [^2]。 3. **关闭特定功能**:关闭 ADC 和 Timer,同时关闭 PWR 的低电平自动唤醒功能 [^2]。 4. **使能唤醒中断**:使能唤醒 IO 的外部中断,并刷新各标志位,如外部中断标志位、休眠唤醒标志位等 [^2]。 5. **判断唤醒条件**:判断此时无按键或适配器插入,若有任意其一,则跳过下一步的休眠指令,恢复单片机初始化配置 [^2]。 6. **进入休眠模式**:根据功耗要求及需要待机的资源要求,选择对应的休眠模式。被唤醒之后,系统从休眠指令之后继续执行 [^2]。 7. **再次进入休眠**:按键唤醒系统后,在满足特定条件(如一段时间内无操作)时,系统再次执行上述休眠流程,进入深度休眠。 ### 示例代码(伪代码) 以下是一个简单的伪代码示例,展示了单片机按键唤醒后再次进入深度休眠的基本流程: ```c // 全局变量 volatile int wakeup_flag = 0; // 按键中断处理函数 void button_interrupt_handler() { wakeup_flag = 1; } // 休眠函数 void enter_sleep_mode() { // 关总中断 disable_global_interrupt(); // GPIO的睡前配置 configure_gpio_for_sleep(); // 关闭ADC和Timer disable_adc(); disable_timer(); // 关闭PWR的低电平自动唤醒功能 disable_pwr_auto_wakeup(); // 使能唤醒IO的外部中断 enable_wakeup_interrupt(); // 刷新各标志位 clear_interrupt_flags(); // 判断此时无按键或适配器插入 if (!is_button_pressed() && !is_adapter_inserted()) { // 进入休眠模式 enter_sleep(); } else { // 恢复单片机初始化配置 initialize_mcu(); } } // 主函数 int main() { // 初始化 initialize_system(); // 注册按键中断处理函数 register_button_interrupt(button_interrupt_handler); while (1) { if (wakeup_flag) { // 系统休眠唤醒的初始化 enable_timer(); start_timer(); // 处理按键唤醒后的操作 handle_wakeup(); // 清除唤醒标志 wakeup_flag = 0; // 再次进入休眠 enter_sleep_mode(); } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值