博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android闹钟实现原理
阅读量:6276 次
发布时间:2019-06-22

本文共 3687 字,大约阅读时间需要 12 分钟。

  hot3.png

 闹钟的原理可用下面我自己画的一幅图来概括:(不对的地方,尽管吐槽

 
  我们来看看新建闹钟到闹钟响铃的步骤:
 
 1、新建一个闹钟:
    
 

// 获得AlarmManager实例        final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);               // 实例化Intent        Intent intent = new Intent();        // 设置Intent action属性        intent.setAction("com.test.BC_ACTION");        intent.putExtra("msg", "该去开会啦!");        // 实例化PendingIntent        final PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0,                intent, 0);        // 获得系统时间        final long time = System.currentTimeMillis();  am.set(AlarmManager.RTC_WAKEUP, time+5000, sender);//5秒后闹铃        // 设置按钮单击事件        setBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // 重复提示,从当前时间开始,间隔5秒                am.setRepeating(AlarmManager.RTC_WAKEUP, time,                        5 * 1000, pi);            }        });
  
  在AndroidMainfest.xml里注册广播接收器
 
  
  
 2、定义一个AlarmReceiver extends BroadcastReceiver接收广播,并弹出闹钟提醒视图。
 
 上面用到一个AlarmManage,我们分别来看看它的处理闹钟流程和作用及例子。
 处理闹钟流程:对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要遍历闹铃列表并设置即将触发的闹铃给闹铃设备,并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。
 
 作用及例子:AlarmManage中文名闹钟,或者叫做“全局定时器”更合适,它的作用和Timer类似,有两种使用方法:1、在特定时长后(特定时间)执行某任务;2、周期性的执行某任务,AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.
 
 (1)在指定时长后(特定时间)执行某项操作
 
      
//操作:发送一个广播,广播接收后Toast提示定时操作完成     Intent intent =new Intent(Main.this, alarmreceiver.class);    intent.setAction("short");    PendingIntent sender=        PendingIntent.getBroadcast(Main.this, 0, intent, 0);       //设定一个五秒后的时间    Calendar calendar=Calendar.getInstance();    calendar.setTimeInMillis(System.currentTimeMillis());    calendar.add(Calendar.SECOND, 5);       AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);    alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);    //或者以下面方式简化    //alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);       Toast.makeText(Main.this, "五秒后alarm开启", Toast.LENGTH_LONG).show();
 
 
 (2)周期性的执行某项操作

Intent intent =new Intent(Main.this, alarmreceiver.class);    intent.setAction("repeating");    PendingIntent sender=PendingIntent        .getBroadcast(Main.this, 0, intent, 0);       //开始时间    long firstime=SystemClock.elapsedRealtime();    AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);  //5秒一个周期,不停的发送广播    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP            , firstime, 5*1000, sender);
 
 
 AlarmManager的取消:(其中需要注意的是取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager)
 
Intent intent =new Intent(Main.this, alarmreceiver.class);  intent.setAction("repeating");  PendingIntent sender=PendingIntent         .getBroadcast(Main.this, 0, intent, 0);  AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);  alarm.cancel(sender);
 

 AlarmManager还将闹钟分为五种类型:

 

public   static final int ELAPSED_REALTIME          
   //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠  
   时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
  
public static final int ELAPSED_REALTIME_WAKEUP
 //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。  
  
public static final int RTC
   //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用  
   System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
 
public static final int RTC_WAKEUP
 //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。 
 
Public static final int POWER_OFF_WAKEUP
   //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4 (0x00000004)。

综上所述,感觉AlarmManage和NotificationManager差不多,NotificationManager例子请见文章
  我的博客其它文章列表
 

转载于:https://my.oschina.net/helu/blog/141733

你可能感兴趣的文章
IOS 录制视频
查看>>
limit检查
查看>>
Android Things 简介
查看>>
菜鸟学Linux 第049篇笔记 DNS log, zone, view
查看>>
菜鸟学Linux 第054篇笔记 建立加密的http
查看>>
ListView 的多选模式
查看>>
宏正自动科技发表新款8/16端口双滑轨LCD KVM多电脑切换器
查看>>
解决 Missing GL version
查看>>
VS 编译链接错误集锦
查看>>
Dns域名服务器之,ACL ,转发域及子域授权的基本配置
查看>>
Android权限列表
查看>>
Linux中的网络监控命令
查看>>
360项目-07
查看>>
使用Nginx进行TCP/UDP端口转发
查看>>
读书笔记2(Effective java)
查看>>
[bat]批量替换文件内容
查看>>
Java代码到字节码——第一部分
查看>>
Linux挂载安装VMware tool
查看>>
Android中利用ViewFliper实现屏幕切换效果
查看>>
群发quota报警邮件脚本
查看>>