在开发android的过程中,需要一个定时提醒的功能,原本以为是一个很简单的功能,但是发现网上能找到的讲解或者代码都很或多或少地缺少一部分的设置和关键代码,所以我才注册了简书账户,分享一下。
在研究的这几天,遇到了以下四个问题:
1、标题中的技术都没有接触过;
2、开发过程中android studio项目的SDK过高导致的方法报错;
3、安装APK的手机版本过高导致状态栏无法显示通知信息;
4、高版本的手机对于软件的权限管理非常严格;
下面我就以我的代码来分享一下。
软件环境:
android studio3.6.3
项目选择的SDK:android 4.1(API:16)
使用的技术:
AlarmManager:
AlarmManager:AlarmManager类是android提供的用于在未来的制定时间弹出一个警告信息,或者完成指定操作的类。实际上AlarmManage是一个全局的定时器,在AlarmManage设置警告后,android将自动开启目标应用,即使手机处于休眠状态。所以,使用AlarmManage类也可以实现关机后仍可响应的闹钟。
AlarmManage对象的常用方法(其余的方法可以另外搜索):
set(int type, long triggerAtTime, PendingIntent operation); // 执行一次闹钟
setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation); //循环闹钟
参数介绍:
type:服务类型,包含四中类型:ELAPSED_REALTIME
在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。
ELAPSED_REALTIME_WAKEUP
在指定的延时过后,发送广播,并唤醒设备(即使关机也会执行operation所对应的组件)。
延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。
RTC
指定当系统调用System.currentTimeMillis()方法返回的与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,但不唤醒设备)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。
RTC_WAKEUP
指定当系统调用System.currentTimeMillis()方法返回的与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,并唤醒设备)。即使系统关机也会执行operation所对应的组件。
triggerAtTime:表示闹钟执行时间。
PendingIntent operation:表示闹钟响应动作:如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Contextc,int i,Intentintent,int j)方法;
如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,inti,Intentintent,int j)方法;
如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Contextc,inti,Intent intent,int j)方法。
如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。
interval:为闹钟间隔,以毫秒为单位。内置的几个变量如下:
INTERVAL_DAY:设置闹钟,间隔一天
INTERVAL_HALF_DAY:设置闹钟,间隔半天
INTERVAL_FIFTEEN_MINUTES:设置闹钟,间隔15分钟
INTERVAL_HALF_HOUR:设置闹钟,间隔半个小时
INTERVAL_HOUR:设置闹钟,间隔一个小时
使用步骤:
第一步:获取AlarmManage对象;AlarmManage alarm = (AlarmManage) getSystemService(Context.ALARM_SERVICE);
第二步:指定时间(判断当前时间和指定的时间之间的大小,如果当前时间 > 指定时间,则时间添加一天);long firstTime = SystemClock.elapsedRealtime(); // 开机之后到现在的