1、 实训报告姓 名: 祝新 学 号: 1144131 专 业: 软件技术 课程名称: android 实训 项目名称: 闹铃 指导教师: 王皓 实训日期: 2013 年 10 月 28 日 至 2014 年 1 月 2 日 2014 年 1 月 2 日Android 项目开发实训总结报告目 录第一章 概述 .1第二章 需求分析 .22.1 项目背景 22.2 项目需求 2第三章 相关技术 .33.1 Adnroid 平台介绍 .33.2 关键技术研究 3第四章 概要设计 .44.1 系统体系结构 44.2 用户界面设计 .4第五章 详细设计 .95.1 添加闹铃功能模块 9第六章 结论 .19A
2、ndroid 项目开发实训总结报告- 0 -第一章 概述本课题要求:设计一个基于 Android 的位置闹钟的软件。实现的功能有:a) 能在 Android 上利用其提供地相关 API 获取位置信息。b) 能通过界面设置闹钟的启动条件,包括入场与出场条件的设c) 建立后台服务进程,监查位置信息,当满足触发条件时,闹钟响应相应事件。需重点研究的关键问题:通过 Android Api 获取位置信息,并在指定地点设置闹钟提醒。解决思路:在界面里显示当前位置信息(经纬度值) ,并输入指定地点的经纬度值,编程实现对位置信息实时更新,将两者的经纬度转换为距离,如在误差范围内则启动闹铃功能。Android
3、项目开发实训总结报告1第二章 需求分析2.1 项目背景移动互联网时代的来临,直接促进了搭载智能操作系统、具有强大扩展性的智能手机、平板电脑等移动终端产业的蓬勃发展。搭载安卓操作系统的智能手机目前已经成为市场上最炙手可热的智能产品。开放的源代码和零成本已经让安卓在全世界范围内受到青睐并迅速获得了主要手机厂商和数百万软件开发者的支持,2011 年安卓系统的市场份额已经超过 Symbian,成为全球第一大智能手机操作系统。GPS 产业从军用转入民用后,正在逐渐向普通消费群体发展,作为使用终端的 GPS 产品正逐渐的深入人们生活得各个领域。GPS 使用终端最主要的应用方面主要体现在各种接收器,比如航空
4、、航海用途的接收器,汽车导航设备,或用于登上、远足的手持接收器等终端产品。GPS 接收终端的结构包括,接收天线、芯片组、电池等,以及外部按键和液晶面板等相关零部件。该 课 题 实现在手机操作系统 Android 上将 GPS 导航和闹钟提醒两个功能结合起来,携带方便,并能超越传统的时间闹钟提醒功能,使用起来灵活、快捷、省心,是一款实用而且高端的手机软件。2.2 项目需求“位置闹钟”是一款提醒你地点的软件,它通过地图指定提醒的目的地,同时要求定位精确、使用过程可用 Wifi(节省手机流量)和普通无网络。“位置闹钟”可以通过 GPS 定位和手机蜂窝基站定位两种定位方式来监测用户所在位置。当你靠近目
5、的地的时候, “位置闹钟”会进行闹钟提醒。而在封闭的空间中,如拥挤的公交车上,接收不到卫星的 GPS 信号,此时,手机基站定位就可派上用场。虽然基站的定位精度比起 GPS 来说稍低,但完全可以满足位置提醒的要求。此外, “位置闹钟”还可以后台运行,且能和普通闹钟一样设置多个位置闹铃,有良好的人机交互界面,可对其编辑、启用或禁用。Android 项目开发实训总结报告2第三章 相关技术3.1 Adnroid 平台介绍Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国
6、大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由 Andy Rubin 开发,主要支持手机。2005 年 8 月由 Google 收购注资。2007 年 11 月,Google 与 84 家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良 Android 系统。随后 Google 以 Apache 开源许可证的授权方式,发布了 Android 的源代码。第一部 Android 智能手机发布于2008 年 10 月。Android 逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011 年第一季度,Android 在全球的市场份额首次超过塞班系统,跃
7、居全球第一。 2012 年 11 月数据显示,Android 占据全球智能手机操作系统市场 76%的份额,中国市场占有率为 90%。2013 年 09 月 24 日谷歌开发的操作系统 Android 在迎来了 5 岁生日,全世界采用这款系统的设备数量已经达到 10亿台。3.2 关键技术研究应用 SQLLite 数据库:SQLite 提供结构化的数据存取。SQLite 是一款轻型的数据库,它的设计目标是嵌入式的,目前已经在很多嵌入式产品使用了它,它占用的资源非常低。它能够支持 Windows/Linux/Unix 等主流的操作系统,同时能够跟很多程序语言相结合,比如 php,Java 等,还有
8、ODBC 接口,同样比起Mysql,PostgreSQL 来讲,它的处理速度比它们都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小,虽只有 250KB 但支持数据库大小至 2TB。它虽然很小巧,但是支持的 SQL 语句毫不逊色于其它开源数据库。同时它还支持事务功能和并发处理等等。SQLite 也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。Android 项目开发实训总结报告3第四章 概要设计4.1 系统体系结构系统旨在建立 Android 系统的闹钟,主要有如下几个核心功能模块如图 5 所示。图 5 系统功能模块图4.2 用户界面
9、设计通过小组讨论用户的界面如下:4.2.1 主页面主程序图片选取音乐、闹铃提醒方式添加闹铃、设置时间、重复等节能功能返回首页Android 项目开发实训总结报告44.2.2 添加闹铃功能4.2.3 音乐清单Android 项目开发实训总结报告- 5 -第五章 详细设计5.1 添加闹铃功能模块具体实现代码如下:/* Copyright (C) 2009 The Android Open Source Project* Licensed under the Apache License, Version 2.0 (the “License“);* you may not use this file
10、 except in compliance with the License.* You may obtain a copy of the License at* http:/www.apache.org/licenses/LICENSE-2.0* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an “AS IS“ BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY
11、 KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.android.superdeskclock;import java.text.DateFormatSymbols;import java.util.Calendar;import android.content.Context;import android.database.Cursor;Androi
12、d 项目开发实训总结报告- 6 -import android.media.RingtoneManager;import .Uri;import android.os.Parcel;import android.os.Parcelable;import android.provider.BaseColumns;public final class Alarm implements Parcelable / Parcelable apis/public static final Parcelable.Creator CREATOR= new Parcelable.Creator() public
13、 Alarm createFromParcel(Parcel p) return new Alarm(p);public Alarm newArray(int size) return new Alarmsize;public int describeContents() return 0;public void writeToParcel(Parcel p, int flags) p.writeInt(id);p.writeInt(enabled ? 1 : 0);p.writeInt(hour);p.writeInt(minutes);p.writeInt(daysOfWeek.getCo
14、ded();p.writeLong(time);p.writeInt(vibrate ? 1 : 0);p.writeString(label);p.writeParcelable(alert, flags);p.writeInt(silent ? 1 : 0);/新增p.writeInt(times);p.writeInt(interval);/ end Parcelable apisAndroid 项目开发实训总结报告- 7 -/ Column definitions/public static class Columns implements BaseColumns /* The con
15、tent:/ style URL for this table*/public static final Uri CONTENT_URI =Uri.parse(“content:/com.android.superdeskclock/alarm“);/* Hour in 24-hour localtime 0 - 23.* Type: INTEGER*/public static final String HOUR = “hour“;/* Minutes in localtime 0 - 59* Type: INTEGER*/public static final String MINUTES
16、 = “minutes“;/* Days of week coded as integer* Type: INTEGER*/public static final String DAYS_OF_WEEK = “daysofweek“;/* Alarm time in UTC milliseconds from the epoch.* Type: INTEGER*/public static final String ALARM_TIME = “alarmtime“;/* True if alarm is active* Type: BOOLEAN*/public static final St
17、ring ENABLED = “enabled“;/*Android 项目开发实训总结报告- 8 -* True if alarm should vibrate* Type: BOOLEAN*/public static final String VIBRATE = “vibrate“;/* Message to show when alarm triggers* Note: not currently used* Type: STRING*/public static final String MESSAGE = “message“;/* Audio alert to play when a
18、larm triggers* Type: STRING*/public static final String ALERT = “alert“;/新增public static final String TIMES = “times“;public static final String INTERVAL = “interval“;/* The default sort order for this table*/public static final String DEFAULT_SORT_ORDER =HOUR + “, “ + MINUTES + “ ASC“;/ Used when f
19、iltering enabled alarms.public static final String WHERE_ENABLED = ENABLED + “=1“;static final String ALARM_QUERY_COLUMNS = _ID, HOUR, MINUTES, DAYS_OF_WEEK, ALARM_TIME,ENABLED, VIBRATE, MESSAGE, ALERT /新增,TIMES,INTERVAL;/* These save calls to cursor.getColumnIndexOrThrow()* THEY MUST BE KEPT IN SYN
20、C WITH ABOVE QUERY COLUMNS*/public static final int ALARM_ID_INDEX = 0;public static final int ALARM_HOUR_INDEX = 1;public static final int ALARM_MINUTES_INDEX = 2;Android 项目开发实训总结报告- 9 -public static final int ALARM_DAYS_OF_WEEK_INDEX = 3;public static final int ALARM_TIME_INDEX = 4;public static f
21、inal int ALARM_ENABLED_INDEX = 5;public static final int ALARM_VIBRATE_INDEX = 6;public static final int ALARM_MESSAGE_INDEX = 7;public static final int ALARM_ALERT_INDEX = 8;/新增public static final int ALARM_TIMES_INDEX = 9;public static final int ALARM_INTERVAL_INDEX = 10;/ End column definitions/
22、Public fieldspublic int id;public boolean enabled;public int hour;public int minutes;public DaysOfWeek daysOfWeek;public long time;public boolean vibrate;public String label;public Uri alert;public boolean silent;/新增public int times;public int interval;public Alarm(Cursor c) id = c.getInt(Columns.AL
23、ARM_ID_INDEX);enabled = c.getInt(Columns.ALARM_ENABLED_INDEX) = 1;hour = c.getInt(Columns.ALARM_HOUR_INDEX);minutes = c.getInt(Columns.ALARM_MINUTES_INDEX);daysOfWeek = new DaysOfWeek(c.getInt(Columns.ALARM_DAYS_OF_WEEK_INDEX);time = c.getLong(Columns.ALARM_TIME_INDEX);vibrate = c.getInt(Columns.ALA
24、RM_VIBRATE_INDEX) = 1;label = c.getString(Columns.ALARM_MESSAGE_INDEX);/新增Android 项目开发实训总结报告- 10 -times = c.getInt(Columns.ALARM_TIMES_INDEX);interval = c.getInt(Columns.ALARM_INTERVAL_INDEX);String alertString = c.getString(Columns.ALARM_ALERT_INDEX);if (Alarms.ALARM_ALERT_SILENT.equals(alertString
25、) if (Log.LOGV) Log.v(“Alarm is marked as silent“);silent = true; else if (alertString != null / If the database alert is null or it failed to parse, use the/ default alert.if (alert = null) alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);public Alarm(Parcel p) id = p.readInt();ena
26、bled = p.readInt() = 1;hour = p.readInt();minutes = p.readInt();daysOfWeek = new DaysOfWeek(p.readInt();time = p.readLong();vibrate = p.readInt() = 1;label = p.readString();alert = (Uri) p.readParcelable(null);silent = p.readInt() = 1;/新增times=p.readInt();interval=p.readInt();/ Creates a default ala
27、rm at the current time.public Alarm() id = -1;Android 项目开发实训总结报告- 11 -Calendar c = Calendar.getInstance();c.setTimeInMillis(System.currentTimeMillis();hour = c.get(Calendar.HOUR_OF_DAY);minutes = c.get(Calendar.MINUTE);vibrate = true;daysOfWeek = new DaysOfWeek(0);alert = RingtoneManager.getDefaultU
28、ri(RingtoneManager.TYPE_ALARM);/新增times=10;interval=0;public String getLabelOrDefault(Context context) if (label = null | label.length() = 0) return context.getString(R.string.default_label);return label;/* Days of week code as a single int.* 0x00: no day* 0x01: Monday* 0x02: Tuesday* 0x04: Wednesda
29、y* 0x08: Thursday* 0x10: Friday* 0x20: Saturday* 0x40: Sunday*/static final class DaysOfWeek private static int DAY_MAP = new int Calendar.MONDAY,Calendar.TUESDAY,Calendar.WEDNESDAY,Calendar.THURSDAY,Calendar.FRIDAY,Calendar.SATURDAY,Calendar.SUNDAY,;Android 项目开发实训总结报告- 12 -/ Bitmask of all repeatin
30、g daysprivate int mDays;DaysOfWeek(int days) mDays = days;public String toString(Context context, boolean showNever) StringBuilder ret = new StringBuilder();/ no daysif (mDays = 0) return showNever ?context.getText(R.string.never).toString() : “;/ every dayif (mDays = 0x7f) return context.getText(R.
31、string.every_day).toString();/ count selected daysint dayCount = 0, days = mDays;while (days 0) if (days days = 1;/ short or long form?DateFormatSymbols dfs = new DateFormatSymbols();String dayList = (dayCount 1) ?dfs.getShortWeekdays() :dfs.getWeekdays();/ selected daysfor (int i = 0; i 0) ret.appe
32、nd(context.getText(R.string.day_concat);Android 项目开发实训总结报告- 13 -return ret.toString();private boolean isSet(int day) return (mDays public void set(int day, boolean set) if (set) mDays |= (1 day); else mDays public void set(DaysOfWeek dow) mDays = dow.mDays;public int getCoded() return mDays;/ Return
33、s days of week encoded in an array of booleans.public boolean getBooleanArray() boolean ret = new boolean7;for (int i = 0; i 7; i+) reti = isSet(i);return ret;public boolean isRepeatSet() return mDays != 0;/* returns number of days from today until next alarm* param c must be set to today*/public in
34、t getNextAlarm(Calendar c) if (mDays = 0) return -1;Android 项目开发实训总结报告- 14 -int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;int day = 0;int dayCount = 0;for (; dayCount 7; dayCount+) day = (today + dayCount) % 7;if (isSet(day) break;return dayCount;Android 项目开发实训总结报告- 15 -第六章 结论经过累计一个多月的努力,基于 Andr
35、oid 平台的位置闹钟软件终于完成了。由于对 Android 浓厚的兴趣引发了我对 JAVA 的好奇心,毕竟 Android 是基于JAVA 的,虽然这个软件的开发没有达到老师的期望值,但是在老师和同学的帮助下,我还是慢慢摸索完成了这个软件。在这个过程中,我学会了很多知识,比如 Android 环境的搭建和配置问题、GPS 技术和 Android 的构架和基本组建等等,同时我学会的最重要的一点是,要利用现有的资源去解决问题,在图书馆、在网络上寻找答案,也可以请教老师或与同学相互讨论。虽然,这个软件目前运行良好,但是我认为代码的健壮还很差,在整个工程的构思方面也不足,用户操作界面还不够灵活,这些问题还需要今后逐一解决。与此同时,这个软件还可以进一步扩展,例如“同时设置多个闹钟” 、 “信息分享” 、 “应用推荐”等,使功能更加强大,带给用户更好的体验与便捷的生活服务。