本文主要是介绍《第一行代码-Android》学习笔记(二十),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
服务的最佳实践:
1.Android定时任务的两种实现方式:
a) Timmer:当手机进入休眠状态的时候,会导致Timmer定时任务无法正常执行。
b) Alarm:具有唤醒CPU的功能,能够保证每次进入定时任务的时候,CPU都能正常的工作。(唤醒CPU和唤醒屏幕是两个不同的概念)
2.如何使用Alarm机制:
a) 获取AlarmManager类的实例:
AlarmManager manager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
b) 调用set()方法:
i. 第一个参数:指定AlarmManager的工作类型:
1. ELAPSED_REALTIME:定时任务触发时间从系统开机开始算起,但不唤醒CPU;
2. ELAPSED_REALTIME_WAKEUP:定时任务触发时间从系统开机开始算起,并唤醒CPU
3. RTC:定时任务的触发时间从1970年1月1日0点开始算起,但不唤醒CPU;
4. RTC_WAKEUP:定时任务的触发时间从1970年1月1日0点开始算起,并唤醒CPU;
SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数;
SystemClock.currentTimeMillis()方法可以获取到从1970年1月1日0点至今的毫秒数;
ii. 第二个参数:就是定时任务触发的时间,以毫秒为单位
iii. 第三个参数:PendingIntent,可以通过其类方法getBroadcast()方法获取一个能够执行广播的PendingIntent,这样当定时任务执行的时候,广播接收器的onReceiver()方法就可以得到执行。
3.实现长期后台定时服务,只要在pendingintnet获取到的广播接收器中,继续打开这个服务,那么就可以定时一直走下去了。
4.代码实例:
long time = SystemClock.elapsedRealtime() + 10 * 1000;
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//这个intent用来后面发起广播在·
Intent i = new Intent(this, AlarmReceiver.class);
//getBroadcast——通过该函数获得的PendingIntent将会扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, pendingIntent);
public class AlarmReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//继续启动服务,实现无限定时任务
Intent i = new Intent(context, AlarmService.class);
context.startService(i);
}
}
5.Alarm优化4.4版本之后,出于性能的考虑,系统会自动检测目前有多少Alarm任务存在,然后将几个任务触发时间相近的放在一起执行,降低CPU唤醒的次数。
如果想要和之前一样准确无误,可以调用新方法:setExact()代替set方法。
这篇关于《第一行代码-Android》学习笔记(二十)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!