您的位置:首页 > 编程语言

长期在后台定时运行的服务 第一行代码

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()方法,就可以保证任务准时执行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程 android