《第一行代码-Android》学习笔记(二十)

来源:互联网 发布:安卓刷机软件哪个最好 编辑:程序博客网 时间:2024/04/30 23:22

服务的最佳实践:

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:定时任务的触发时间从1970110点开始算起,但不唤醒CPU

4. RTC_WAKEUP:定时任务的触发时间从1970110点开始算起,并唤醒CPU

SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数;

SystemClock.currentTimeMillis()方法可以获取到从1970110点至今的毫秒数;

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方法。

0 0