Android例子—简单定时后台线程的实现
来源:互联网 发布:淘宝卖假货被公安抓了 编辑:程序博客网 时间:2024/05/22 02:08
前者不适合于需要长期在后台运行的定时任务,CPU一旦休眠,Timer中的定时任务 就无法运行;Alarm则不存在这种情况,他具有唤醒CPU的功能,另外,也要区分CPU 唤醒与屏幕唤醒!
使用流程:
- Step 1:获得Service: AlarmManager manager = (AlarmManager)
getSystemService(ALARM_SERVICE); - Step 2:通过set方法设置定时任务 int anHour = 2 * 1000; long triggerAtTime =
SystemClock.elapsedRealtime() + anHour;
manager.set(AlarmManager.RTC_WAKEUP,triggerAtTime,pendingIntent); - Step 3:定义一个Service 在onStartCommand中开辟一条事务线程,用于处理一些定时逻辑
- Step 4:定义一个Broadcast(广播),用于启动Service,最后别忘了,在AndroidManifest.xml中对这Service与Boradcast进行注册!
参数详解: set(int type,long startTime,PendingIntent pi)
①type: 有五个可选值:
AlarmManager.ELAPSED_REALTIME: 闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;
AlarmManager.ELAPSED_REALTIME_WAKEUP 闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;
AlarmManager.RTC 闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;
AlarmManager.RTC_WAKEUP 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;
PS:第一个参数决定第二个参数的类型,如果是REALTIME的话就用: SystemClock.elapsedRealtime( )方法可以获得系统开机到现在经历的毫秒数 如果是RTC的就用:System.currentTimeMillis()可获得从1970.1.1 0点到 现在做经历的毫秒数
②startTime: 闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。 需要注意的是,本属性与第一个属性(type)密切相关,如果第一个参数对应的闹钟 使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本属 性就得使用相对时间(相对于系统启动时间来说),比如当前时间就表示为: SystemClock.elapsedRealtime();如果第一个参数对应的闹钟使用的是绝对时间 (RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本属性就得使用绝对时间, 比如当前时间就表示为:System.currentTimeMillis()。
③PendingIntent: 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent 是Intent的封装类。
需要注意的是:
如果是通过启动服务来实现闹钟提示的话, PendingIntent对象的获取就应该采用Pending.getService (Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话, PendingIntent对象的获取就应该采用 PendingIntent.getBroadcast (Context c,int i,Intent intent,int j)方法;
如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。
另外:
从4.4版本后(API 19),Alarm任务的触发时间可能变得不准确,有可能会延时,是系统 对于耗电性的优化,如果需要准确无误可以调用setExtra()方法~
核心代码:
public class LongRunningService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { //这里开辟一条线程,用来执行具体的逻辑操作: new Thread(new Runnable() { @Override public void run() { Log.d("BackService", new Date().toString()); } }).start(); AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); //这里是定时的,这里设置的是每隔两秒打印一次时间=-=,自己改 int anHour = 2 * 1000; long triggerAtTime = SystemClock.elapsedRealtime() + anHour; Intent i = new Intent(this,AlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi); return super.onStartCommand(intent, flags, startId); }}
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context,LongRunningService.class); context.startService(i); }}
- Android例子—简单定时后台线程的实现
- 基于Java线程实现后台定时监控
- SpringMVC整合Quartz实现定时任务---简单的例子
- 线程的简单例子
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子!!!
- Android 解析后台返回为Json数据的简单例子
- 用线程实现简单的定时扫描任务
- 简单快速实现使用线程后台执行作业的方法
- Maven生命周期
- 代理模式1
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)
- 如何巧妙使用PDF转换图片软件
- json工具类
- Android例子—简单定时后台线程的实现
- virtualenv python虚拟环境
- Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序
- zookeeper 集群重启之后无法使用
- linux下用phpize给PHP动态添加扩展
- 为什么手机无法运行应用? Values之谜
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)
- 段错误产生原因;和;计算机大端小端概念和判别方法
- 使用BigDecimal进行精确计算工具类