一、引言
项目要加定时任务,所以了解了下AlarmManager。
二、AlarmManager是什么
AlarmManager这个类提供对系统闹钟服务的访问接口。
你可以为你的应用设定一个在未来某个时间唤醒的功能。
当闹钟响起,实际上是系统发出了为这个闹钟注册的广播,会自动开启目标应用。
注册的闹钟在设备睡眠的时候仍然会保留,可以选择性地设置是否唤醒设备,但是当设备关机和重启后,闹钟将会被清除。
三、AlarmManager的使用
AlarmManager这个类提供对系统闹钟服务的访问接口。
对它的获取是通过系统服务:
Context.getSystemService(Context.ALARM_SERVICE)
AlarmManager mAlarmManagerOne=(AlarmManager) getSystemService(ALARM_SERVICE);
三种方法;
set(int type, long triggerAtMillis,PendingIntentoperation)方法将会设置一个闹钟。
注意:对于计时操作,可能使用Handler更加有效率和简单。
设置闹钟的时候注意:
1.如果声明的triggerAtMillis是一个过去的时间,闹钟将会立即被触发。
2.如果已经有一个相同intent的闹钟被设置过了,那么前一个闹钟将会取消,被新设置的闹钟所代替。
PendingIntent pIntentTwo=PendingIntent.getBroadcast(this,10,timeTaskIntentTwo,PendingIntent.FLAG_CANCEL_CURRENT);
第二个参数不能一样。
setRepeating(int type, long triggerAtMillis, long intervalMillis,PendingIntentoperation)方法将会设置一个重复性的闹钟。
比set方法多了一个间隔参数。
setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi)//该方法用于设置可重复执行的定时器。与setRepeating相比,这个方法更加考虑系统电量,比如系统在低电量情况下可能不会严格按照设定的间隔时间执行闹钟,因为系统可以调整报警的交付时间,使其同时触发,避免超过必要的唤醒设备。
四、注册广播
<receiver android:name=".MyReceiver"
android:process=":newinst">
<action android:name="ELITOR_CLOCK"/>
<action android:name="ELITOR_CLOCK2"/>
<action android:name="ELITOR_CLOCK3"/>
</receiver>
在此讨论一下process属性,它规定了组件(activity, service, receiver等)所在的进程。
通常情况下,没有指定这个属性,一个应用所有的组件都运行在应用的默认进程中,进程的名字和应用的包名一致。
比如manifest的package="com.example.helloalarm",则默认进程名就是com.example.helloalarm。
<application>元素的process属性可以为全部的组件设置一个不同的默认进程。
组件可以override这个默认的进程设置,这样你的应用就可以是多进程的。
如果你的process属性以一个冒号开头,进程名会在原来的进程名之后附加冒号之后的字符串作为新的进程名。当组件需要时,会自动创建这个进程。这个进程是应用私有的进程。
如果process属性以小写字母开头,将会直接以属性中的这个名字作为进程名,这是一个全局进程,这样的进程可以被多个不同应用中的组件共享。
五、服务
Intent intent=new Intent(this,server.class)
startServer(intent)
六、总结
AlarmManager的使用比较简单,注意PendingIntent的CODE要不一样。
重复发送可以定义多个AlarmManager。
setRepeating可能存在时间并不准确的问题,需注意。