Android 闹钟 开发过程记录(一)

首先,说明一下:本人大三,刚自学完android基础知识,利用寒假一个月左右的时间,开发了一个闹钟小程序,趁着开学,印象还很深,热情还未减,把过程整理记录下来。这样自己以后也好复习,或许还能帮到有需要的同学。好了,不废话了。先看一下闹钟几个界面(基本上是照着小米自带的闹钟做的界面)。

 Android 闹钟 开发过程记录(一)_第1张图片           Android 闹钟 开发过程记录(一)_第2张图片


 Android 闹钟 开发过程记录(一)_第3张图片           Android 闹钟 开发过程记录(一)_第4张图片


基本的界面就是这样的了。(开发中的控件都是用的系统自带的,包括一些图片也没有精心制作,我暂时关注的是功能实现,谅解)


闹钟设置界面的布局文件如下(由于许多同类控件布局差不多,就都抽取到一个style文件中了):




    

        



关于TimePicker下面的 Textview,就是显示 xx小时 xx分钟后响铃的控件,如果 重复周期 为 只响一次 或 每天, 这个时间差很好算,如果是用户自定义的重复周期,我一开始就想得有点复杂了,后来我在csdn问了这个问题,有一位哥们给了我一个很好的思路:先求出 此刻 与 用户定义的 每一天的时间差,在找出其中最小的那个。 

具体代码如下:

	/**只响一次的 时间间隔
	 * @param givenHour  自定义的小时
	 * @param givenMinute  自定义的分钟
	 * @return 返回"当前时间"距"给定时间"的时间差(单位为毫秒) 	   如果"给定时间"<"当前时间",则返回的是下一天的"给定时间"
	 */
	public static int dTime(int givenHour, int givenMinute){

		long currentTimeInMillis = System.currentTimeMillis();

		Calendar givenCalendar = Calendar.getInstance();
		givenCalendar.set(Calendar.HOUR_OF_DAY, givenHour);
		givenCalendar.set(Calendar.MINUTE, givenMinute);
		givenCalendar.set(Calendar.SECOND, 0);
		givenCalendar.set(Calendar.MILLISECOND, 0);
		long givenTimeInMillis = givenCalendar.getTimeInMillis();

		int result;
		if(currentTimeInMillis < givenTimeInMillis){
			result = (int) (givenTimeInMillis - currentTimeInMillis);
		}else{
			result = (int) (24*60*60*1000 - (currentTimeInMillis - givenTimeInMillis));
		}
		return result;
	}
	
	/**当前时间 与 自定义周期 的 时间间隔(只能指定一天)
	 * @param givenHour 自定义的 小时
	 * @param givenMinute 自定义的 分钟
	 * @param givenDay 自定义的 星期几
	 * @return 返回"当前时间"距"给定时间"的时间差(单位为毫秒) 	   如果"给定时间"<"当前时间",则返回的是下一周的"给定时间"
	 */
	public static int dTime(int givenHour, int givenMinute, int givenDay){
		
		long currentTimeInMillis = System.currentTimeMillis();

		Calendar givenCalendar = Calendar.getInstance();
		givenCalendar.set(Calendar.DAY_OF_WEEK, givenDay);
		givenCalendar.set(Calendar.HOUR_OF_DAY, givenHour);
		givenCalendar.set(Calendar.MINUTE, givenMinute);
		givenCalendar.set(Calendar.SECOND, 0);
		givenCalendar.set(Calendar.MILLISECOND, 0);
		long givenTimeInMillis = givenCalendar.getTimeInMillis();

		int result;
		if(currentTimeInMillis < givenTimeInMillis){
			result = (int) (givenTimeInMillis - currentTimeInMillis);
		}else{
			result = (int) (7*24*60*60*1000 - (currentTimeInMillis - givenTimeInMillis));
		}
		return result;
	}
	
	/**当前时间 与 自定义周期 的 最近的时间间隔 (可指定多个天数)
	 * @param givenHour 自定义的 小时
	 * @param givenMinute 自定义的 分钟
	 * @param givenDays 自定义的 星期几(可变数组 比如 周一,周三,周日等)
	 * @return 返回"当前时间"距"最近星期时间"的时间差(单位为毫秒) 	   
	 * 比如:今天周四,自定义重复时间是 周三,周五,那么返回的是 此刻距离周五的时间间隔
	 * 再比如:今天周四10:00AM,自定义重复时间是 周四 和 周五 的 9:00AM,那么返回的依然是 此刻距离周五的时间间隔
	 */
	public static int dTime(int givenHour, int givenMinute, int... givenDays){
		List dtimes = new ArrayList();
		for (int givenDay : givenDays) {
			int dTime;
			if(givenDay == Calendar.MONDAY){
				dTime = dTime(givenHour, givenMinute, Calendar.MONDAY);
			}else if(givenDay == Calendar.TUESDAY){
				dTime = dTime(givenHour, givenMinute, Calendar.TUESDAY);
			}else if(givenDay == Calendar.WEDNESDAY){
				dTime = dTime(givenHour, givenMinute, Calendar.WEDNESDAY);
			}else if(givenDay == Calendar.THURSDAY){
				dTime = dTime(givenHour, givenMinute, Calendar.THURSDAY);
			}else if(givenDay == Calendar.FRIDAY){
				dTime = dTime(givenHour, givenMinute, Calendar.FRIDAY);
			}else if(givenDay == Calendar.SATURDAY){
				dTime = dTime(givenHour, givenMinute, Calendar.SATURDAY);
			}else {
				dTime = dTime(givenHour, givenMinute, Calendar.SUNDAY);
			}
			dtimes.add(dTime);
		}
		
		int result = Collections.min(dtimes);
		
		return result;
		
	}

通过这个算法工具,不仅可以在滑动 timepicker时间的时候,textview显示,而且可以在闹钟设置完成时,toast提示。


你可能感兴趣的:(android项目)