文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android开发技巧(三)—— 创建定时任务

2022-06-06 12:59

关注

每种手机都有自己的休眠策略,

Android
手机在长时间不操作时会自动让CPU进入睡眠状态,这就导致JAVA原生
Timer
的定时任务无法运行。

所以我们需要借助

Alarm
唤醒CPU

一、
Alarm
机制

Alarm借助了

AlermManager
类,这个类和
NotificationManger
类似。通过调用
Context
getSystemService()
,来获取实例,不过这里要传入
Context..ALARM_SERVICE
,因此,获取
AlarmManager
实例可以写成:

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

接下来调用

AlertManager
set()
方法就能设置一个定时任务,比如10秒后任务执行:

long triggerAtTime = SystemClock.elapsedRealtime() + 10*1000;
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);

SystemClock.elepsedRealtime()
可以获取到系统开机至今的毫秒数
System.cuurrentTimeMillis()
可以获取到1970.1.1至今的毫秒数
set()
方法有三个参数:

第一个参数:整型参数,用于指定工作类型,有四种值可选:
ELAPSED_REALTIME
:定时任务的触发时间从开机开始算起,但不会唤醒CPU
ELAPSED_REALTIME_WAKEUP
:定时任务的触发时间从系统开机开始算起,会唤醒CPU
RTC
:定时任务的触发时间从1970.1.1开始算起,但不会唤醒CPU
RTC_WAKEUP
:定时任务的触发事件从1970.1.1开始算起,但会唤醒CPU 第二个参数:任务的触发时间,以毫秒为单位 第三个参数
PendingIntent
,一个可以触发的广播或服务

再比如要实现一个可以长时间在后台定时运行的服务:
首先建一个普通的服务,比如起名为

LongRunningService
,然后把触发定时任务的代码写在
onStartCommand()

public class LongRunningService extends Service{
	@Override
	public IBinder onBind(Intent intent){
		return null;
	}
	@Overide
	public int onStartCommand(Intent intent, int flags, int startId){
		new Thread(new Runnable(){
			@Override
			public void run(){
				// 在这里执行具体的逻辑事件
			}
		}).start();
		AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
		int anHour = 60*60*1000;
		long triggerAtTime = SystemClock.elapsedRealtime()+anHour();
		Intent i = new Intent(this, LongRunningService.class);
		PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
		manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
		return super.onStartCommand(intent, flags, startId);
	}
}

这样就能保证定时任务每一小时执行依次一次,最后,这样启动这个定时任务:

Intent intent = new Intent(context, LongRunningService.class);
context.startService(intent);

Androiod4.4 之后,Alarm任务的触发时间不再准确,这是系统做出了耗电优化,用

setExact()
代替
set()
即可准时运行

二、
Doze
模式

在安卓6.0之后,谷歌又加入了全新的Doze模式,就是说当屏幕关闭一段时间后,系统会对CPU,网络、Alarm等活动做出限制,从而延长电池寿命
但是系统会间歇性退出

Doze
模式一小段时间,让应用完成他们的同步操作和Alerm任务。

具体限制:

网络访问被禁止 忽略唤醒CPU和屏幕操作 不再wifi扫描 不再执行同步任务 Alarm任务将会在下次退出Doze模式时执行

这使得我们的Alarm任务不再准时,但如果你非要准时执行,也有特殊方案:

AlarmManager.setAndAllowWhileIdle()
AlermManager,setExactAndAllowWhileIdle()
使得Doze模式也能正常执行定时任务,使用方法和之前的
setExact()
set()
一样


作者:有意识的呼吸


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯