赞
踩
2021SC@SDUSC
目录
上篇文章主要分析了“晃动取消闹钟”的三个页面布局和闹钟设置时间功能。本篇文章主要分析程序设置闹钟的细节部分。
此函数处理子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类是一个基础抽象类,是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(闹钟服务)可以通过它开发手机闹钟类的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调用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通过调用setOnCheckedChangeListener()方法来添加选项改变监听
通过重写onCheckedChanged()来完成选项改变后的操作。如果选择开启的话,我们会调用isoutdue()方法来判断是今日还是明日的闹钟,通过Toast.makeText().show()通过提示展示给用户闹钟设置完成,再调用上文提到的自定义方法setAlarm()来设置指定闹钟。
如果switch选择关闭的话,同样会通过Toast.makeText().show()通过提示展示给用户闹钟关闭,且调用cancelAlarm()来取消闹钟。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。