Handler
和 Runnable
原理:通过 Handler
定时发送消息,循环执行任务。
适用场景:短时间、高频次的定时任务(如 UI 更新)。
缺点:应用退到后台或被杀死后任务停止。
// 示例代码 private Handler handler = new Handler(); private Runnable runnable = new Runnable() { @Override public void run() { // 执行任务 Log.d("Timer", "Task executed"); // 循环调用 handler.postDelayed(this, 1000 60); // 每分钟执行一次 } }; // 启动循环 handler.post(runnable); // 停止循环 handler.removeCallbacks(runnable);
AlarmManager
设置重复闹钟原理:通过 AlarmManager
设置周期性闹钟,唤醒设备执行任务。
适用场景:需要长期后台执行的任务(如定时同步数据)。
注意:需处理设备休眠、应用被杀等情况。
// 示例代码(API 19+) AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 设置每分钟执行一次 alarmManager.setRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 1000 60, // 间隔时间(毫秒) pendingIntent ); // 广播接收器处理任务 public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 执行任务 Log.d("Alarm", "Task executed by AlarmManager"); } }
WorkManager
的周期性任务原理:WorkManager
提供兼容系统的后台任务调度,支持周期性执行。
优点:兼容不同 Android 版本,抗杀进程,适配电池优化。
适用场景:需要可靠执行的长期任务。
// 示例代码(依赖 WorkManager 库) PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES) .setConstraints(Constraints.NONE) // 可设置网络、电量等约束 .build(); WorkManager.getInstance(context).enqueue(workRequest); // Worker 类定义 public class MyWorker extends Worker { @NonNull @Override public Result doWork() { // 执行任务 Log.d("WorkManager", "Task executed"); return Result.success(); } }
JobScheduler
(API 21+)原理:通过 JobScheduler
调度任务,支持精准条件(如网络可用时执行)。
适用场景:需要根据系统条件执行的任务。
缺点:仅支持 API 21 及以上。
// 示例代码(API 21+) JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo jobInfo = new JobInfo.Builder(jobId, new ComponentName(this, MyJobService.class)) .setPersisted(true) // 设备重启后仍生效 .setPeriodic(1000 60, 1000 5) // 每分钟执行一次,灵活间隔 5 秒 .build(); jobScheduler.schedule(jobInfo); // JobService 类定义 public class MyJobService extends JobService { @Override public boolean onStartJob(JobParameters params) { // 执行任务 Log.d("JobScheduler", "Task executed"); jobFinished(params, false); // 标记任务完成 return true; } }
方法 | 可靠性 | 兼容性 | 适用场景 | 缺点 |
---|---|---|---|---|
Handler |
低 | 全版本 | 短期、UI 相关任务 | 应用被杀后停止 |
AlarmManager |
中 | 全版本 | 长期后台任务 | 需处理系统限制,精度可能受 Doze 影响 |
WorkManager |
高 | 全版本 | 可靠后台任务 | 需依赖库,部分功能需 API 23+ |
JobScheduler |
中高 | API 21+ | 条件触发任务 | 低版本不兼容 |
解答:
AlarmManager
配合 BroadcastReceiver
,并通过 PendingIntent
唤醒应用。 WorkManager
,其内置机制可恢复任务,但需确保应用至少启动过一次以初始化 WorkManager
。 AndroidManifest.xml
中声明接收器或服务为 exported
,并处理设备重启后的恢复逻辑。解答:
WorkManager
,其任务会优先适配系统调度策略(如 Doze 模式)。