Android笔记:定时提醒、闹钟实现

简介:

android要实现定时的功能那肯定就要用到闹铃相关的技术,

那么android闹铃实现是基于 AlarmManager 这个类的,首先我们来看一下它的几个主要的方法。

两个核心的方法 :

1
private  final  IAlarmManager mService;
1
2
3
4
5
6
public  void  set( int  type,  long  triggerAtMillis, PendingIntent operation) { 
      try  {                                                                  
          mService.set(type, triggerAtMillis, operation);                    
      catch  (RemoteException ex) {                                         
      }                                                                      
  }

1
2
3
4
5
6
7
  public  void  setRepeating( int  type,  long  triggerAtMillis,                        
          long  intervalMillis, PendingIntent operation) {                         
      try  {                                                                       
          mService.setRepeating(type, triggerAtMillis, intervalMillis, operation);
      catch  (RemoteException ex) {                                              
      }                                                                           
  }


第一个方法主要功能是注册一个比较简单的闹铃,第二个方法是注册一个重复的闹铃,这里重复的意思是指:设置5s, 那么每隔5s会执行一次 。

 

我们看到这里具体的实现都是基于IAlarmManager的,而IAlarmManager是一个aidl(Android Interface definition language),具体的就不详细介绍了,大家有兴趣的可以自己研究一下。

 

下面我来看下set(int type, long triggerAtMillis, PendingIntent operation)方法是如何调用的:

1
2
3
4
5
6
7
8
9
10
11
// 进行闹铃注册
Intent intent =  new  Intent(MainActivity. this , AlarmReceiver. class );
PendingIntent sender = PendingIntent.getBroadcast(MainActivity. this 0 , intent,  0 );
 
// 过10s 执行这个闹铃
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND,  10 );
 
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);


看一下AlarmReceiver 的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 
  * @ClassName: AlarmReceiver  
  * @Description: 闹铃时间到了会进入这个广播,这个时候可以做一些该做的业务。
  * @author HuHood
  * @date 2013-11-25 下午4:44:30  
  *
  */
public  class  AlarmReceiver  extends  BroadcastReceiver {
     
     @Override
     public  void  onReceive(Context context, Intent intent) {
     Toast.makeText(context,  "闹铃响了, 可以做点事情了~~" , Toast.LENGTH_LONG).show();
     }
 
}

还有别忘了,AndroidManifest.xml中需要加入:

1
<receiver android:name= "com.example.alarmmanagerdemo.AlarmReceiver"  android:process= ":remote" >

运行之后,过10s 弹出 "闹铃响了,可以做点事情了~~", 说明成功了。

 

ok,这个结果肯定不是我们想要的,我们想要的功能是每天定时提醒的功能,那么需要基于

setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)

 

这个方法来实现,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Intent intent =  new  Intent(MainActivity. this , AlarmReceiver. class );
PendingIntent sender = PendingIntent.getBroadcast(MainActivity. this 0 , intent,  0 );
 
long  firstTime = SystemClock.elapsedRealtime();   // 开机之后到现在的运行时间(包括睡眠时间)
long  systemTime = System.currentTimeMillis();
 
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
// 这里时区需要设置一下,不然会有8个小时的时间差
calendar.setTimeZone(TimeZone.getTimeZone( "GMT+8" ));
calendar.set(Calendar.MINUTE, mMinute);
calendar.set(Calendar.HOUR_OF_DAY, mHour);
calendar.set(Calendar.SECOND,  0 );
calendar.set(Calendar.MILLISECOND,  0 );
// 选择的定时时间
long  selectTime = calendar.getTimeInMillis();
// 如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if (systemTime > selectTime) {
Toast.makeText(MainActivity. this , "设置的时间小于当前时间" , Toast.LENGTH_SHORT).show();
calendar.add(Calendar.DAY_OF_MONTH,  1 );
selectTime = calendar.getTimeInMillis();
}
// 计算现在时间到设定时间的时间差
long  time = selectTime - systemTime;
firstTime += time;
// 进行闹铃注册
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                 firstTime, DAY, sender);
Log.i(TAG, "time ==== "  + time + ", selectTime ===== "
+ selectTime +  ", systemTime ==== "  + systemTime + ", firstTime === "  + firstTime);
Toast.makeText(MainActivity. this , "设置重复闹铃成功! " , Toast.LENGTH_LONG).show();

以上的思路大致是这样的,首先根据设置的时间,算出当前时间离设置时间的时间差,加上这个时间差,我们就知道第一次提醒的时间,然后再设定重复的时间间隔,我们这里设置1天就可以了。



现在解释一下setRepeating中第一个参数:


AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;

RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。




以上摘自:http://hualang.iteye.com/blog/1304054


还有,我们这里是调用广播的形式来实现的,也可以用service的方式来进行实现,只要把PendingIntent改动一下即可,相关代码:
PendingIntent.getService(MainActivity.this, 0,new Intent(MainActivity.this,AlarmService.class), 0);
其他的均相同。


完整Demo下载:
http://download.csdn.net/detail/jakend/6612033






本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1679698,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
238 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
7月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
344 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
2月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
77 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
94 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
78 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
4月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
87 0
|
7月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
117 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
6月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
60 0
|
7月前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
7月前
|
设计模式 缓存 前端开发
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer