长期在后台定时运行的服务 第一行代码
2015-11-24 20:01
465 查看
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); long triggerAtTime = System.currentTimeMillis() + 10 * 1000*60; manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent); 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("LongRunningService", "executed at " + new Date(). toString()); } }).start(); AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); int anHour = 60 * 60 * 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); } } public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context, LongRunningService.class); context.startService(i); } } 因为一旦启动 LongRunningService,就会在 onStartCommand()方法里设定一个定时任务,这样一小时后 AlarmReceiver 的 onReceive()方 法就将得到执行, 然后我们在这里再次启动 LongRunningService, 这样就形成了一个永久的 循环, 保证 LongRunningService 可以每隔一小时就会启动一次, 一个长期在后台定时运行的 服务自然也就完成了 从 Android 4.4 版本开始, Alarm 任务的触发时间将会变得不准确, 有可能会延迟一段时间后任务才能得到执行。 这并不是个 bug, 而是系统在耗电性方面进行 的优化。 系统会自动检测目前有多少 Alarm 任务存在, 然后将触发时间将近的几个任务放在 一起执行,这就可以大幅度地减少 CPU 被唤醒的次数,从而有效延长电池的使用时间。 当然, 如果你要求 Alarm 任务的执行时间必须准备无误, Android 仍然提供了解决方案。 使用 AlarmManager 的 setExact()方法来替代 set()方法,就可以保证任务准时执行了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories