前言
最近研究 Android 开发,涉及到了 service 的知识,这里就连同 AlarmManager 一起来记录实现一个简单的定时服务。
这里只是简单的实现定时功能,以及我所遇到的一些问题。
前提
- 首先基础的 Android 的布局等操作都在此忽略。
- 了解 Android 的 service 的生命周期。
思想
- 创建一个 AlarmTest 类 继承 android.app.Service 。
- MainActivity 中启动此 service。
- AlermTest 中配置 AlermManage ,其中包含有 Intent 与 PendingIntent 配置
- 使用 broadcastReceiver 来接收 广播,做出相应的提示。
过程
创建AlarmTest
在 OnStartCommand
中 进行相关配置服务
1 |
|
创建 AlertBroadcast 类,继承 Broadcast
主要在 onReceive 中为接收到 service 广播后的处理。
根据自己的情况编写代码
开启服务
1 | Intent intent = new Intent(this,AlarmTest.class); |
最后记得在 ActivityMainifest.xml 中配置
一定要配置 Service 以及 BroadcastReceive
1 | <service android:name="..."></service> |
注意事项
- AlarmManager 在 set 后就相当于启动了计时,计时是由 Android 系统控制,Kill后台的情况是有的,但目前我还在学习。
- AlarmManager 中 set 往往在最后会出现计时不精确的情况,推荐使用 setExact 方法。
- Android 不同版本对 AlermManager 也有所调整,所以得根据 Android 版本来设置,以确保更大兼容。
1
2
3
4
5
6
7
8
9alarmManager.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 中配置服务.