整理自《第一行代码》
由于手机的休眠策略,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的工作模式/类型。
有四种类型可选:
不会唤醒CPU
会唤醒CPU
不会唤醒CPU
会唤醒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("", "香香的感觉,可带劲啦!");
}
}).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("", "服务启动");
}
}
即可实现每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模式下也能正常执行。