0%

Android-初探AlarmManager定时服务

前言

最近研究 Android 开发,涉及到了 service 的知识,这里就连同 AlarmManager 一起来记录实现一个简单的定时服务。

这里只是简单的实现定时功能,以及我所遇到的一些问题。

前提

  1. 首先基础的 Android 的布局等操作都在此忽略。
  2. 了解 Android 的 service 的生命周期。

思想

  1. 创建一个 AlarmTest 类 继承 android.app.Service 。
  2. MainActivity 中启动此 service。
  3. AlermTest 中配置 AlermManage ,其中包含有 Intent 与 PendingIntent 配置
  4. 使用 broadcastReceiver 来接收 广播,做出相应的提示。

过程

创建AlarmTest

OnStartCommand 中 进行相关配置服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

// 闹钟管理
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 设置时间10s,毫秒计算
long seconds = 10*1000;

// 获取系统至今的时间,并加上设定的时间
long triggerAtMillis = SystemClock.elapsedRealtime() + seconds;
// 设置要触发的intent,这里触发广播
Intent alarmIntent = new Intent(this,AlertBroadcast.class);
// padingIntent来设置动作,获取广播配置
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,alarmIntent,0);
// 闹钟设置
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtMillis,pendingIntent);
//提示
Toast toast = Toast.makeText(this,"服务设置完毕!!",Toast.LENGTH_LONG);
toast.show();

创建 AlertBroadcast 类,继承 Broadcast

主要在 onReceive 中为接收到 service 广播后的处理。
根据自己的情况编写代码

开启服务

1
2
Intent intent = new Intent(this,AlarmTest.class);
startService(intent);

最后记得在 ActivityMainifest.xml 中配置

一定要配置 Service 以及 BroadcastReceive

1
2
3
<service android:name="..."></service>

<receiver android:name="..."></receiver>

注意事项

  • AlarmManager 在 set 后就相当于启动了计时,计时是由 Android 系统控制,Kill后台的情况是有的,但目前我还在学习。
  • AlarmManager 中 set 往往在最后会出现计时不精确的情况,推荐使用 setExact 方法。
  • Android 不同版本对 AlermManager 也有所调整,所以得根据 Android 版本来设置,以确保更大兼容。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    alarmManager.cancel(pendingIntent);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 4.4
    alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtMillis, pendingIntent);
    } else {
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtMillis, pendingIntent);
    }

  • 如果这种定时服务只执行一次,或者可能需要根据不同情况再运行,最好当服务完成后,将其关闭。
  • 千万不要忘记在 ActivityMainifest.xml 中配置服务.