android 后台长时间执行周期性定时任务 解决方案收集
来源:互联网 发布:淘宝网棒球帽 编辑:程序博客网 时间:2024/05/17 06:14
IntentService, AlarmManager, PendingIntent.加一个BroardcastReciever
IntentService会自己开一个线程,AlarmManager加PendingIntent可以实现没两小时发个广播,然后Reciever启动这个Service,Service干完活后stop掉。
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = createAlarmIntent();//启动自身服务的Intent
long nextTime = SystemClock.elapsedRealtime() + NEXT_DELAY;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextTime, pi);
Alarm manager 主要管理硬件时钟。
一些与时间相关的应用,如日历,闹钟等需要使用Alarm Manager的服务。Alarm manager功能相对比较简单,相关代码位于
frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp
frameworks/base/services/java/com/android/server/AlarmManagerService.java
一. frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp
这部分代码直接管理硬件时钟,设备名为/dev/alarm。包括打开设备,关闭设备,设置时区,设置触发时间(timeout),以及等待时钟触发。
二. frameworks/base/services/java/com/android/server/AlarmManagerService.java
这部分封装目录一中的代码,向上提供java接口,同时与客户端(如calendar)交互,接收来自客户端的时钟设置请求,并在时钟触发时通知客户端。
Alarm是在预定的时间上触发Intent的一种独立的方法。
Alarm超出了应用程序的作用域,所以它们可以用于触发应用程序事件或动作,甚至在应用程序关闭之后。与Broadcast Receiver结合,它们可以变得尤其的强大,可以通过设置Alarm来启动应用程序或者执行动作,而应用程序不需要打开或者处于活跃状态。
举个例子,你可以使用Alarm来实现一个闹钟程序,执行正常的网络查询,或者在“非高峰”时间安排耗时或有代价的操作。
对于仅在应用程序生命周期内发生的定时操作,Handler类与Timer和Thread类的结合是一个更好的选择,它允许Android更好地控制系统资源。
Android中的Alarm在设备处于睡眠模式时仍保持活跃,它可以设置来唤醒设备;然而,所有的Alarm在设备重启时都会被取消。
Alarm的操作通过AlarmManager来处理,通过getSystemService可以获得其系统服务,如下所示:
AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
为了创建一个新的Alarm,使用set方法并指定一个Alarm类型、触发时间和在Alarm触发时要调用的Intent。如果你设定的Alarm发生在过去,那么,它将立即触发。
这里有4种Alarm类型。你的选择将决定你在set方法中传递的时间值代表什么,是特定的时间或者是时间流逝:
❑ RTC_WAKEUP
在指定的时刻(设置Alarm的时候),唤醒设备来触发Intent。
❑ RTC
在一个显式的时间触发Intent,但不唤醒设备。
❑ ELAPSED_REALTIME
从设备启动后,如果流逝的时间达到总时间,那么触发Intent,但不唤醒设备。流逝的时间包括设备睡眠的任何时间。注意一点的是,时间流逝的计算点是自从它最后一次启动算起。
❑ ELAPSED_REALTIME_WAKEUP
从设备启动后,达到流逝的总时间后,如果需要将唤醒设备并触发Intent。
Alarm的创建过程演示如下片段所示:
int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long timeOrLengthofWait = 10000;
String ALARM_ACTION = “ALARM_ACTION”;
Intent intentToFire = new Intent(ALARM_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
alarms.set(alarmType, timeOrLengthofWait, pendingIntent);
当Alarm到达时,你指定的PendingIntent将被触发。设置另外一个Alarm并使用相同的PendingIntent来替代之前存在的Alarm。
取消一个Alarm,调用AlarmManager的cancel方法,传入你不再希望被触发的PendingIntent,如下面的代码所示:
alarms.cancel(pendingIntent);
接下来的代码片段中,设置了两个Alarm,随后马上取消了第一个Alarm。第一个Alarm显式地设置了在特定的时间唤醒设备并发送Intent。第二个设置为从设备启动后,流逝时间为30分钟,到达时间后如果设备在睡眠状态也不会唤醒它。
AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
String MY_RTC_ALARM = “MY_RTC_ALARM”;
String ALARM_ACTION = “MY_ELAPSED_ALARM”;
PendingIntent rtcIntent = PendingIntent.getBroadcast(this, 0, new Intent(MY_RTC_ALARM), 1);
PendingIntent elapsedIntent = PendingIntent.getBroadcast(this, 0, new Intent(ALARM_ACTION), 1);
// Wakeup and fire intent in 5 hours.(注释可能有错)
Date t = new Date();
t.setTime(java.lang.System.currentTimeMillis() + 60*1000*5);
alarms.set(AlarmManager.RTC_WAKEUP, t.getTime(), rtcIntent);
// Fire intent in 30 mins if already awake.
alarms.set(AlarmManager.ELAPSED_REALTIME, 30*60*1000, elapsedIntent);
// Cancel the first alarm.
alarms.cancel(rtcIntent);
1.添加权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
2.建一个Service,在里面写:
WakeLock mWakeLock;// 电源锁
/**
* onCreate时,申请设备电源锁
*/
private void acquireWakeLock() {
if (null == mWakeLock) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE, "myService");
if (null != mWakeLock) {
mWakeLock.acquire();
}
}
}
/**
* onDestroy时,释放设备电源锁
*/
private void releaseWakeLock() {
if (null != mWakeLock) {
mWakeLock.release();
mWakeLock = null;
}
}
来自:http://blog.csdn.net/cankingapp/article/details/14229423
- android 后台长时间执行周期性定时任务 解决方案收集
- android 后台长时间执行周期性定时任务 解决方案收集
- android 后台长时间执行周期性定时任务 解决方案收集
- android 后台长时间执行周期性定时任务 解决方案收集
- Android后台执行定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- android service 后台执行定时任务
- Android学习之定时执行后台任务
- android后台执行的定时任务
- android: 后台执行的定时任务
- Android后台执行的定时任务
- 导航栏之自定义按钮
- Django ReconnectingWebSocket 使用
- 微信小程序wx:if条件渲染
- NOIP2016全国信息学分区联赛提高组第二试 蚯蚓 ssl 2599 队列
- 【Hadoop】Apache Sqoop - Overview——Sqoop 概述
- android 后台长时间执行周期性定时任务 解决方案收集
- 后缀自动机学习笔记2(hiho128周)
- (三)生命周期与作用域
- android常见异常整理
- Android 自定义View 之 触摸消息派发
- CSS预处理器——SASS学习笔记(二)
- 排列和组合的实现
- 语言技能表@liuger
- Picasso 源码 学习(二) LruCache