AlarmManager的定时器方法使用注意事项

今天看公司之前的项目中用到了AlarmManager这个类,用来定时刷新Launcher上的时间小部件,但是工程中设定的时间是3s,实际打印日志的时间是一分钟才刷新一次,感觉有点不对头(其实是同事先发现这个情况的),后来经过查阅资料,确定了AlarmManager这个类的setRepeating方法有个API变迁的变动,特意在此记录一下:

之前项目中是这样写的

mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ACTION_REFRESH_DESKTOP_ICON);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 3 * 1000, pendingIntent1);

然后创建一个广播接收者做逻辑就可以了,但是在API19之后,谷歌为了性能优化,setRepeating方法不准确了,在网上查找到说setWindow方法在API19之后可以精确定时,写了个Demo试了试,如下:

private  void setAlarmTime() {    
/**刷新时间widget闹钟定时器(3秒一次)**/    
  mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);    
  Intent intent = new Intent(TEST);    
  PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);    
  if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){        
  //API小于等于19的时候使用
     setRepeatingmAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, REFRESH_RATE * 1000, pendingIntent);    
  }else {        
  //API大于19的时候使用
      setWindowmAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,0,REFRESH_RATE * 1000, pendingIntent);    }}

广播接收者:

public class AlarmReceover extends BroadcastReceiver {
    public static  final String TEST= MainActivity.TEST;
    private static final String TAG = "AlarmReceover_LOG";
    AlarmManager mAlarmManager;
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(action == TEST){
            setAlarmTime(context);
        }
    }

    private  void setAlarmTime(Context context) {
        /**刷新时间widget闹钟定时器(3秒一次)**/
        mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(TEST);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        if(Build.VERSION.SDK_INT >Build.VERSION_CODES.KITKAT){ //api大于19的时候
            //和setRepeating的最大的区别是这个动作只执行一次
            mAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),50 * 1000, pendingIntent);
        }
        upDateClockView();
    }

    public void upDateClockView() {
        Calendar c = Calendar.getInstance();
        int hour =c.get(Calendar.HOUR_OF_DAY);
        int min = c.get(Calendar.MINUTE);
        int second = c.get(Calendar.SECOND);
        Log.e(TAG,"时钟控件刷新时间-》" + hour + ":" + min +":" + second);
    }
}

这样就可以,根据版本的不同切换不同的方法,但是有一点是,虽然说setWindow方法在API19之后比setRepeating方法精确了,但是也不是你设置3s就是准确的3s,我在设置3s的时候,打印的日志全部都是5s的间隔,个别6s的间隔出现;当设置50s的时候,间隔有时是30s,有时是40s。我想谷歌提供这个API只是想让开发者用来设置闹铃的,所以误差在一分钟左右都是没问题的,如果用它来做特别精准的事情我想还是差一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值