android 定时器的实现

博客分类:  Android  

 


在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了。 


实验1:使用Java.util.Timer。 
在onStart()创创建Timer,每5秒更新一次计数器,并启动。 


mTimer = new Timer();       

mTimer.schedule(new TimerTask() {           

            @Override

            public void run() {

                ++mCount;

                mHandler.sendEmptyMessage(0);               

            }

        }, 5*1000, 5*1000);
  
当连接USB线进行调试时,会发现一切工作正常,每5秒更新一次界面,即使是按下电源键,仍然会5秒触发一次。 
当拔掉USB线,按下电源键关闭屏幕后,过一段时间再打开,发现定时器明显没有继续计数,停留在了关闭电源键时的数字。 

实验2:使用AlarmService: 
2.1通过AlarmService每个5秒发送一个广播,setRepeating时的类型为AlarmManager.ELAPSED_REALTIME。 


AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);  

am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);

拔掉USB线,按下电源键,过一段时间再次打开屏幕,发现定时器没有继续计数。 
2.2setRepeating是的类型设置为AlarmManager.ELAPSED_REALTIME_WAKEUP 


AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);   

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);

拔掉USB线,按下电源键,过一点时间再次打开屏幕,发现定时器一直在计数。 

如此看来,使用WAKEUP才能保证自己想要的定时器一直工作,但是肯定会引起耗电量的增加


AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作

AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.

下面的代码详细的介绍了两种定时方式的使用:

 (1)在指定时长后执行某项操作

 

Java代码   收藏代码
  1.      //操作:发送一个广播,广播接收后Toast提示定时操作完成  
  2.      Intent intent =new Intent(Main.this, alarmreceiver.class);  
  3.     intent.setAction("short");  
  4.     PendingIntent sender=  
  5.         PendingIntent.getBroadcast(Main.this0, intent, 0);  
  6.       
  7.     //设定一个五秒后的时间  
  8.     Calendar calendar=Calendar.getInstance();  
  9.     calendar.setTimeInMillis(System.currentTimeMillis());  
  10.     calendar.add(Calendar.SECOND, 5);  
  11.       
  12.     AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);  
  13.     alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);  
  14.     //或者以下面方式简化  
  15.     //alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);  
  16.       
  17.     Toast.makeText(Main.this"五秒后alarm开启", Toast.LENGTH_LONG).show();  
 

//注意:receiver记得在manifest.xml注册


Java代码   收藏代码
  1.     public static class alarmreceiver extends BroadcastReceiver{  
  2.   
  3.         @Override  
  4.         public void onReceive(Context context, Intent intent) {  
  5.             // TODO Auto-generated method stub  
  6.             if(intent.getAction().equals("short")){  
  7.                 Toast.makeText(context, "short alarm", Toast.LENGTH_LONG).show();  
  8.             }else{  
  9.                 Toast.makeText(context, "repeating alarm",   
  10.                       Toast.LENGTH_LONG).show();  
  11.             }  
  12.         }  
  13.     }  
 

(2)周期性的执行某项操作

 

Java代码   收藏代码
  1.     Intent intent =new Intent(Main.this, alarmreceiver.class);  
  2.     intent.setAction("repeating");  
  3.     PendingIntent sender=PendingIntent  
  4.         .getBroadcast(Main.this0, intent, 0);  
  5.       
  6.   
  7.     //开始时间  
  8.     long firstime=SystemClock.elapsedRealtime();  
  9.   
  10.     AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);  
  11.   
  12.   //5秒一个周期,不停的发送广播  
  13.     am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP  
  14.             , firstime, 5*1000, sender);  
 

 AlarmManager的setRepeating()相当于Timer的Schedule(task,delay,peroid);有点差异的地方时Timer这个方法是指定延迟多长时间

以后开始周期性的执行task;

AlarmManager的取消:(其中需要注意的是取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager)

 

 

Java代码   收藏代码
  1.   Intent intent =new Intent(Main.this, alarmreceiver.class);  
  2.   intent.setAction("repeating");  
  3.   PendingIntent sender=PendingIntent  
  4.          .getBroadcast(Main.this0, intent, 0);  
  5.   AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);  

更多相关文章

  1. android Setting中隐藏项实现原理与代码
  2. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播
  3. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命
  4. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWo
  5. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
  6. Android 系统概要 ——《第一行代码 Android》

随机推荐

  1. 在 Android 使用 Support Annotations 注
  2. android 摄像头对焦,zoom的通知事件回调,告
  3. Android studio插件GsonFormat,返回json快
  4. Android自定义TextView省略号样式
  5. Android 滑动效果入门篇(二)—— Gallery
  6. Service详解(一):什么是Service
  7. 有关String类的笔试常考题
  8. Android(安卓)AppBarLayout控件
  9. 获取apk签名信息
  10. android动态加载apk