AlarmManager
2013-01-11 18:37
281 查看
AlarmManager
简介:此物是系统的一个服务,独立于CPU。就是说即使手机关机了,AlarmManager依然是活动着的。1. 如何取得实例:
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); |
1.public void set(int type, long triggerAtTime, PendingIntent operation); 设置一个指定类型、时间、延期意图的定时器。 2.public void cancel(PendingIntent operation); 取消所匹配延期意图的定时器。 3.public void setRepeating(int type, long triggerAtTime, long interval,PendingIntent operation); 设置一个指定类型、时间、间隔、延期意图的重复定时器。 4.public void setInexactRepeating(int type, long triggerAtTime, long interval,PendingIntent operation); 设置一个指定类型、时间、间隔、延期意图的不精准的重复定时器。效果与setRepeating方法一致。 |
RTC_WAKEUP 基于绝对时间的,可以把睡眠中的系统唤醒。 RTC 基于绝对时间的,不可以唤醒睡眠的系统,只能等到系统醒来才能执行。 ELAPSED_REALTIME_WAKEUP 基于相对时间的,可以把睡眠中的系统唤醒。 ELAPSED_REALTIME 基于相对时间的,不可以唤醒睡眠的系统,只能等到系统醒来才能执行。 |
问题:什么是相对时间和绝对时间,该怎么去用呢? 相对时间指手机待机时间,就是从手机开机到现在所经历的毫秒值。 什么叫做基于相对时间?现在我想用ELAPSED_REALTIME类型,然后1秒钟后开始定时器任务,我就得这么做: alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+1000, operation);其中SystemClock.elapsedRealtime()就是获取手机待机时间。 绝对时间指手机的真是时间,可以从System.currentTimeMillis()获取当前时间毫秒值。 什么叫做基于绝对时间呢?现在我要用RTC_WAKEUP类型,然后1秒钟后启动定时器任务,我要这么做: alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, operation); |
4. 范例1:指定时间(xxxx年xx月xx时xx分xx秒)执行一个RTC_WAKEUP类型的任务
广播接受者:
publicclass MyReceiver extends BroadcastReceiver { @Override publicvoid onReceive(Context context, Intent intent) { Toast.makeText(context, "I get it", 0).show(); System.out.println("I get it"); } } |
publicclass MainActivity extends Activity { privatefinal String ACTION = "com.hwh.finish"; private AlarmManager alarmManager; @Override publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(); intent.setAction(ACTION); Calendar can = Calendar.getInstance(); int day=can.get(Calendar.DAY_OF_MONTH); can.set(Calendar.DAY_OF_MONTH, day); can.set(Calendar.HOUR_OF_DAY, 17); can.set(Calendar.MINUTE, 27); can.set(Calendar.SECOND, 0); PendingIntent operation = PendingIntent.getBroadcast(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(can.getTimeInMillis()-System.currentTimeMillis()), operation); } } |
范例2:指定时间(xxxx年xx月xx时xx分xx秒)执行一个ELAPSED_REALTIME类型的任务
publicclass MainActivity extends Activity { privatefinal String ACTION = "com.hwh.finish"; private AlarmManager alarmManager; @Override publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(); intent.setAction(ACTION); Calendar can = Calendar.getInstance(); int day=can.get(Calendar.DAY_OF_MONTH); can.set(Calendar.DAY_OF_MONTH, day); can.set(Calendar.HOUR_OF_DAY, 17); can.set(Calendar.MINUTE, 27); can.set(Calendar.SECOND, 0); PendingIntent operation = PendingIntent.getBroadcast(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+(can.getTimeInMillis()-System.currentTimeMillis()), operation); } } |
5. 其他
AlarmManager定时器和Timer有相同的作用,区别在于,Timer是基于程序和系统的,程序被杀掉、系统关机Timer就无法执行了。AlarmManager是单独与系统CPU的一个东西,就算是CPU正在睡眠中(如关机)但是只要AlarmManager中设置的时间到了,它也会唤醒系统,执行任务,前提是type得是WAKEUP类型。
另外,在客户端和服务器交互中,有时候也要维持住一个长连接,在android平台实现长连接就是每隔一定时间去请求一次服务器,不要让链路中断。可以使用Timer,但是它需要用
WakeLock 让 CPU
保持唤醒状态,这样会大量消耗手机电量。所以使用AlarmManager就是最佳方案。关于长连接可以参考
http://blog.jpush.cn/index.php/jpush_wireless_push_principle
相关文章推荐
- android广播事件处理broadcast receive -闹钟实例(运用alarmmanager)
- 深入学习android之AlarmManager
- 拓展篇:如何获得AlarmManager对象
- android闹钟AlarmManager的使用
- 深入学习android之AlarmManager
- Android之AlarmManager-用于定时请求服务器
- Android开发之AlarmManager
- Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- AlarmManager的使用
- AlarmManager与PendingIntent的联合使用(一)
- android开发之AlarmManager
- AlarmManager使用注意事项
- 使用Handler定时和使用AlarmManager定时的区别
- Android中的AlarmManager的使用
- Android alarmmanager的使用方法介绍
- 使用AlarmManager实现定时功能
- AlarmManager
- AlarmManager延迟生效
- Android开发之AlarmManager的用法详解