alarm
整理自《第一行代码》
由于手机的休眠策略,Android会在长时间不操作的情况下自动让cpu进入到睡眠状态。
Alrarm具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工作。
注意是唤醒CPU不是唤醒屏幕。
Alarm机制
主要用AlarmManager类实现,通过调用context的getSystemService()方法来获取实例。
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
获取到实例后,调用AlarmManager的set()方法就可以设置一个定时任务。
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+10*1000,pendingintent);
set()方法有三个参数:
参数一:整型 AlarmManager的工作模式/类型。
有四种类型可选:
ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起 不会唤醒CPU
ELAPSED_REALTIME_WAKEUP 同上 但是会唤醒CPU
RTC 表示让定时任务的出发时间从1970/1/1 00:00开始算起 不会唤醒CPU
REC_WAKEUP 同上 会唤醒CPU
PS:
使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数。
使用system.currenttimemillis()方法可以获取到1970/1/1 00:00至今所经历时间的毫秒数。
参数二:长整型 任务触发的事件,单位是毫秒。
这个一看就懂,古不做记录
参数三:延迟意图 PendingIntent
调用 getService()/getBoradcast() 来获取一个能够被执行的PendingIntent。
当定时任务被触发时,服务在onStartcommand()方法/广播接收器的onreceive()方法 中执行。
示例:每过10秒自动启动一次的服务
public class LongRunningService extends Service { @Nullable @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("FUCK", "香香的感觉,可带劲啦!"); } }).start();/*这里不能忘记start*/ AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); int anHour = 10 * 1000;/*定时10秒*/ long triggerAtTime = System.currentTimeMillis() + anHour; Intent intent1 = new Intent(this, LongRunningService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent1, 0); alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent); return super.onStartCommand(intent, flags, startId); } }
注意不要忘记注册服务
<service android:name=".service.LongRunningService"/>
最后就是启动服务了
在主活动中:
public class MainActivity extends APPCompatActivity { @Override protected void onCreate(Bundle savedinstanceState) { super.onCreate(savedInstanceState); setcontentView(R.layout.activity_main); Intent intent = new Intent(this, LongRunningService.class); this.startService(intent); Log.d("FUCK", "服务启动"); } }
即可实现每10秒再启动一次。
Doze模式
Android6.0之后,Google加入了一个全新的Doze模式,从而可以极大幅度地延长电池的使用寿命。
如果设备未充电,并处于静止状态(7.0中删除了这一条件),且屏幕关闭了一段时间后,就能进入到Doze模式。
在Doze模式下,系统会对CPU、网络、Alarm等活动进行限制,从而延长电池的使用寿命。当然,系统并不会一直处于Doze模式,而是会间歇性地退出Doze模式一小段时间,在这段时间中,应用就可以去完成它的同步操作、Alarm任务等。
Doze模式的工作过程:
在Doze模式下会受到限制的功能:
- 网络访问被禁止。
- 系统忽略唤醒CPU或者屏幕操作。
- 系统不再执行WiFi扫描。
- 系统不再执行同步服务。
- Alarm任务将会在下次退出Doze模式的时候执行。
PS:如果你要求Alarm任务即使在Doze模式下也必须正常执行,Android提供了解决方案:
调用AlarmManager的setAndAllowwhileIdle()或者setExactAndAllowWhileIdle()方法就能让定时任务即使在Doze模式下也能正常执行。
相关阅读
AlarmManager介绍 见名知意闹钟管理者,当然不代表AlarmManager只是用来做闹钟应用的,作为一个系统级别的提示服务,其实它的作用和Ti