2021SC@SDUSC移动互联网项目分析——晃动取消闹钟(二)

2021SC@SDUSC

目录

所需基本知识

onActivityResult()

Calendar类

AlarmManager类

程序设定闹钟

主Activity获取用户设置时间

判定时间

设置系统闹钟

Switch开启/取消闹钟


上篇文章主要分析了“晃动取消闹钟”的三个页面布局和闹钟设置时间功能。本篇文章主要分析程序设置闹钟的细节部分。

所需基本知识

onActivityResult()

此函数处理子Activity的结果,当子Activity关闭时,onActivityResult事件处理程序将在父级触发。
可以通过重写该事件处理程序来处理子Activity的返回结果。

该事件处理程序中会接收三个参数分别是:requestCode、resultCode、data
三个参数的含义如下:

requestCode:请求码,对应你在startActivityForResult(Intent intent, int requestCode)中传入requestCode,该参数的作用是让你在有多个activity返回结果时,能判断是哪一个activity返回。requestCode使用-1或者[0,65536)中的某一个int值时不会报错,但是使用-1时,onActivityResult()方法不会被调用。

resultCode:子Activity设置的结果码,用于指示操作结果。可以是任何整数值,但通常是resultCode= =RESULT_OK或resultCode==RESULT_CANCELED。(子Activity结果码由setResult()设置,setResult()还能设置返回结果的Intent)

Data:用于打包返回数据的Intent,可以包括用于表示所选内容的URI。子Activity也可以在返回数据Intent时,添加一些附加消息。

注意:如果子Activity异常关闭,结果码的默认值为RESULT_CANCELED

onActivityResult()通常与startActivityForResult()结合使用,主Activity先调用startActivityForResult()开启子Activity,然后通过OnActivity()待子Activity关闭后接收子Activity传来的数据。

Calendar类

Calendar类是一个基础抽象类,是Android开发中需要获取时间时必不可少的一个工具类。在Android中,Calendar是能够自动根据手机所设置的时区来调整时间戳的,也就是该时区真实的时间戳。

一些Calendar常用的常量字段:

Calendar.YEAR——年份

Calendar.MONTH——月份

Calendar.DATE——日期

Calendar.DAY_OF_MONTH——日期,和上面的字段意义完全相同

Calendar.HOUR——12小时制的小时

Calendar.HOUR_OF_DAY——24小时制的小时

Calendar.MINUTE——分钟

Calendar.SECOND——秒

Calendar.DAY_OF_WEEK——星期几

Calendar.AM——上午

Calendar.PM——上午

可以通过Calendar的实例调用get()方法,传入Calendar的常量字段获取对应的值。如获取年份

private Calendar c = Calendar.getInstance();

c.get(Calendar.YEAR);

注意:通过c.get(Calendar.MONTH)获得的月份是从0开始的,现实中的月份需对结果加1。

其他同理

也可以通过Calendar的实例调用set()方法,第一个参数传入Calendar的常量字段,第二个参数传入想设置的值。如设置年份:

c.set(Calendar.YEAR,"2021");

AlarmManager类

AlarmManager(闹钟服务)可以通过它开发手机闹钟类的APP,是Android中常用的一种系统级别的提示服务。它会在特定的时刻为我们广播一个指定的Inent,简单来说就是我们自己定一个时间,到时间时AlarmManager会为我们广播一个我们设定好的Intent,可以指向某个Activity或者Service。

AlarmManager的常用方法有三个:

1.set(int type,long startTime,PendingIntent pi);

该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。

int type:闹钟的类型,常用的值如下:

AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;

AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;

AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;

AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;

AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间,状态值为4;不过本状态好像受SDK版本影响,某些版本并不支持;

2.setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。

3.setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。

4.cancel(PendingIntent pi);

取消闹钟

程序设定闹钟

主Activity获取用户设置时间

根据前文分析,主Activity调用startActivityForResult(),此方法会开启新的Activity ,子Activity关闭后会向主Activity传回数据,因此可以得到用户设置的时间。在MainActivity.java中还需要接收数据,并改变主页面显示时间的TextView。

主Activity通过onActivityResult()接收selecttime Activity设置的时间

主Activity重写onActivityResult(),首先用if语句判断是否是selecttime这个子Activity(在startActivityForResult()函数中设置selecttime子Activity requestCode=10)

再通过调用Intent的getExtras()函数读取子Activity传来的Bundle。在子Activity中若改变了TimePicker的时间,Bundle中会放入“'flag':1”这组键值对,若位改变时间会放入“'flag':0”这组键值对。所以需要再用个if语句判断子Activity是否修改过时间,未修改过时间则不需要改变主Activity中表示时间的TextView,修改过则需要进行if语句中的操作。

将cgdhour赋值为子Activity改变过后的小时,将cgdmin赋值为子Activity改变过后的小时(通过调用bundle.getInt(key)获取对应的小时、分钟)

再调用TextView中的setText将settime子Activity设置的时间展现在主页面表示时间的TextView thetime上。

还需对时间进行格式化

判定时间

创建函数isoutdue()函数来判断用户设定时间是今日的还是明日的。

首先调用Calendar.getInstance()获取日历实例,然后通过ca.get()方法,传入Calendar的常量字段Calendar.HOUR_OF_DAY、Calendar.MINUTE来获取当前用户手机的小时(24小时制)和分钟。

通过if语句来判断用户传来的小时是否小于手机当前时间,如果是return 1表示此闹钟定于明天,不是则return 0表示此闹钟定于今日。

设置系统闹钟

由于android Api的改变不同版本需要设置不同方法来开启闹钟。版本小于19的调用AlarmManager中的set()方法即可,大于19的需要调用setExact(),方法传参相同。以下着重讲版本小于19的。

因为设置系统闹钟需要用到AlarmManager类的set()方法来设置一次性闹钟。AlarmManager类的set(int type,long startTime,PendingIntent pi)第一个参数表示闹钟的类型,由于闹钟需要在app在睡眠状态下唤醒系统并响铃,所以type设为AlarmManager.RTC_WAKEUP

第二个参数表示闹钟执行时间,因此调用自定义的getTimeDiff()方法得到用户设定的时间。

getTimeDiff()传入用户设定的小时和分钟

首先通过调用isoutdue()方法来判断日期是今天还是明天,如果是明天日历日期就会先获取用户手机的日期并加1,如果是今天则不需要改变,再将小时、分钟设为传入值,秒设为0。

 

第三个参数表示闹钟响应动作

PendingIntent是比Intent更加先进的一个类,它不同于intent,他必须要满足一定条件下,才会触发放在里面的intent操作。可以在程序外部进行执行。即使是程序已经退出了。

这个pendingIntent是通过调用PendingIntent.getActivity()来获取一个PendingIntent,并且该对象日后激发时会启动一个新Activity,第一个参数是传入此时的上下文。

 所以am调用set()方法完成了一个在app睡眠状态下等到用户设定时间唤醒系统并启动响铃Activity的提示操作。

Switch开启/取消闹钟

switch通过调用setOnCheckedChangeListener()方法来添加选项改变监听

通过重写onCheckedChanged()来完成选项改变后的操作。如果选择开启的话,我们会调用isoutdue()方法来判断是今日还是明日的闹钟,通过Toast.makeText().show()通过提示展示给用户闹钟设置完成,再调用上文提到的自定义方法setAlarm()来设置指定闹钟。

如果switch选择关闭的话,同样会通过Toast.makeText().show()通过提示展示给用户闹钟关闭,且调用cancelAlarm()来取消闹钟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值