2022年《Android项目开发实训》项目总结报告 .pdf
实训报告姓名:祝新学号:1144131 专业:软件技术课程名称:android 实训项目名称:闹铃指导教师:王皓实训日期:2013 年 10 月 28 日 至 2014 年 1 月 2 日2014年 1 月 2 日名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 18 页 -Android 项目开发实训总结报告目 录第一章 概述.1第二章 需求分析.22.1 项目背景.22.2 项目需求.2第三章 相关技术.33.1 Adnroid平台介绍.33.2 关键技术研究.3第四章 概要设计.44.1 系统体系结构.44.2 用户界面设计.4第五章 详细设计.65.1 添加闹铃功能模块.6第六章 结论.16名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 18 页 -Android 项目开发实训总结报告-1-1 第一章概述本课题要求:设计一个基于Android 的位置闹钟的软件。实现的功能有:a)能在 Android 上利用其提供地相关API 获取位置信息。b)能通过界面设置闹钟的启动条件,包括入场与出场条件的设c)建立后台服务进程,监查位置信息,当满足触发条件时,闹钟响应相应事件。需重点研究的关键问题:通过Android Api 获取位置信息,并在指定地点设置闹钟提醒。解决思路:在界面里显示当前位置信息(经纬度值),并输入指定地点的经纬度值,编程实现对位置信息实时更新,将两者的经纬度转换为距离,如在误差范围内则启动闹铃功能。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 18 页 -Android 项目开发实训总结报告2 第二章需求分析2.1 项目背景移动互联网时代的来临,直接促进了搭载智能操作系统、具有强大扩展性的智能手机、平板电脑等移动终端产业的蓬勃发展。搭载安卓操作系统的智能手机目前已经成为市场上最炙手可热的智能产品。开放的源代码和零成本已经让安卓在全世界范围内受到青睐并迅速获得了主要手机厂商和数百万软件开发者的支持,2011年安卓系统的市场份额已经超过Symbian,成为全球第一大智能手机操作系统。GPS 产业从军用转入民用后,正在逐渐向普通消费群体发展,作为使用终端的 GPS 产品正逐渐的深入人们生活得各个领域。GPS 使用终端最主要的应用方面主要体现在各种接收器,比如航空、航海用途的接收器,汽车导航设备,或用于登上、远足的手持接收器等终端产品。GPS接收终端的结构包括,接收天线、芯片组、电池等,以及外部按键和液晶面板等相关零部件。该课题实现在手机操作系统Android 上将 GPS导航和闹钟提醒两个功能结合起来,携带方便,并能超越传统的时间闹钟提醒功能,使用起来灵活、快捷、省心,是一款实用而且高端的手机软件。2.2 项目需求“位置闹钟”是一款提醒你地点的软件,它通过地图指定提醒的目的地,同时要求定位精确、使用过程可用Wifi(节省手机流量)和普通无网络。“位置闹钟”可以通过 GPS定位和手机蜂窝基站定位两种定位方式来监测用户所在位置。当你靠近目的地的时候,“位置闹钟”会进行闹钟提醒。而在封闭的空间中,如拥挤的公交车上,接收不到卫星的GPS信号,此时,手机基站定位就可派上用场。虽然基站的定位精度比起GPS来说稍低,但完全可以满足位置提醒的要求。此外,“位置闹钟”还可以后台运行,且能和普通闹钟一样设置多个位置闹铃,有良好的人机交互界面,可对其编辑、启用或禁用。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 18 页 -Android 项目开发实训总结报告3 第三章相关技术3.1 Adnroid平台介绍Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由 Andy Rubin 开发,主要支持手机。2005年 8 月由 Google 收购注资。2007年 11月,Google 与 84 家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android 系统。随后 Google 以 Apache开源许可证的授权方式,发布了Android 的源代码。第一部Android 智能手机发布于 2008年 10 月。Android 逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011 年第一季度,Android 在全球的市场份额首次超过塞班系统,跃居全球第一。2012 年 11 月数据显示,Android 占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。2013 年 09 月 24 日谷歌开发的操作系统Android 在迎来了 5 岁生日,全世界采用这款系统的设备数量已经达到10 亿台。3.2 关键技术研究应用 SQLLite 数据库:SQLite 提供结构化的数据存取。SQLite 是一款轻型的数据库,它的设计目标是嵌入式的,目前已经在很多嵌入式产品使用了它,它占用的资源非常低。它能够支持Windows/Linux/Unix等主流的操作系统,同时能够跟很多程序语言相结合,比如 php,Java 等,还有 ODBC 接口,同样比起 Mysql,PostgreSQL来讲,它的处理速度比它们都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小,虽只有 250KB但支持数据库大小至 2TB。它虽然很小巧,但是支持的SQL语句毫不逊色于其它开源数据库。同时它还支持事务功能和并发处理等等。SQLite也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 18 页 -Android 项目开发实训总结报告4 第四章概要设计4.1 系统体系结构系统旨在建立 Android 系统的闹钟,主要有如下几个核心功能模块如图5 所示。图 5 系统功能模块图4.2 用户界面设计通过小组讨论用户的界面如下:4.2.1 主页面主程序图片选取音乐、闹铃提醒方式添加闹铃、设置时间、重复等节能功能返回首页名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 18 页 -Android 项目开发实训总结报告5 4.2.2 添加闹铃功能4.2.3 音乐清单名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 18 页 -Android 项目开发实训总结报告-6-6 第五章详细设计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 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 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;import android.media.RingtoneManager;import .Uri;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 18 页 -Android 项目开发实训总结报告-7-7 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 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.getCoded();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 apis /名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 18 页 -Android 项目开发实训总结报告-8-8 /Column definitions /public static class Columns implements BaseColumns /*The content:/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=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 String ENABLED=enabled;/*True if alarm should vibrate *Type:BOOLEAN 名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 18 页 -Android 项目开发实训总结报告-9-9 */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 alarm 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 filtering 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 SYNC 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;public static final int ALARM_DAYS_OF_WEEK_INDEX=3;public static final int ALARM_TIME_INDEX=4;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 18 页 -Android 项目开发实训总结报告-10-10 public static final 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 /Public fields public 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.ALARM_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.ALARM_VIBRATE_INDEX)=1;label=c.getString(Columns.ALARM_MESSAGE_INDEX);/新增 times=c.getInt(Columns.ALARM_TIMES_INDEX);interval=c.getInt(Columns.ALARM_INTERVAL_INDEX);名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 18 页 -Android 项目开发实训总结报告-11-11 String alertString=c.getString(Columns.ALARM_ALERT_INDEX);if(Alarms.ALARM_ALERT_SILENT.equals(alertString)if(Log.LOGV)Log.v(Alarm is marked as silent);silent=true;else if(alertString!=null&alertString.length()!=0)alert=Uri.parse(alertString);/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();enabled=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 alarm at the current time.public Alarm()id=-1;Calendar c=Calendar.getInstance();c.setTimeInMillis(System.currentTimeMillis();名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 18 页 -Android 项目开发实训总结报告-12-12 hour=c.get(Calendar.HOUR_OF_DAY);minutes=c.get(Calendar.MINUTE);vibrate=true;daysOfWeek=new DaysOfWeek(0);alert=RingtoneManager.getDefaultUri(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.*0 x00:no day *0 x01:Monday *0 x02:Tuesday *0 x04:Wednesday *0 x08:Thursday *0 x10:Friday *0 x20:Saturday *0 x40: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,;/Bitmask of all repeating days private int mDays;名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 18 页 -Android 项目开发实训总结报告-13-13 DaysOfWeek(int days)mDays=days;public String toString(Context context,boolean showNever)StringBuilder ret=new StringBuilder();/no days if(mDays=0)return showNever?context.getText(R.string.never).toString():;/every day if(mDays=0 x7f)return context.getText(R.string.every_day).toString();/count selected days int dayCount=0,days=mDays;while(days 0)if(days&1)=1)dayCount+;days=1;/short or long form?DateFormatSymbols dfs=new DateFormatSymbols();String dayList=(dayCount 1)?dfs.getShortWeekdays():dfs.getWeekdays();/selected days for(int i=0;i 7;i+)if(mDays&(1 0)ret.append(context.getText(R.string.day_concat);return ret.toString();名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 18 页 -Android 项目开发实训总结报告-14-14 private boolean isSet(int day)return(mDays&(1 0);public void set(int day,boolean set)if(set)mDays|=(1 day);else mDays&=(1 day);public void set(DaysOfWeek dow)mDays=dow.mDays;public int getCoded()return mDays;/Returns 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 int getNextAlarm(Calendar c)if(mDays=0)return-1;名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 18 页 -Android 项目开发实训总结报告-15-15 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;名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 18 页 -Android 项目开发实训总结报告-16-16 第六章结论经过累计一个多月的努力,基于Android 平台的位置闹钟软件终于完成了。由于对 Android 浓厚的兴趣引发了我对JAVA的好奇心,毕竟 Android 是基于 JAVA的,虽然这个软件的开发没有达到老师的期望值,但是在老师和同学的帮助下,我还是慢慢摸索完成了这个软件。在这个过程中,我学会了很多知识,比如Android 环境的搭建和配置问题、GPS 技术和 Android 的构架和基本组建等等,同时我学会的最重要的一点是,要利用现有的资源去解决问题,在图书馆、在网络上寻找答案,也可以请教老师或与同学相互讨论。虽然,这个软件目前运行良好,但是我认为代码的健壮还很差,在整个工程的构思方面也不足,用户操作界面还不够灵活,这些问题还需要今后逐一解决。与此同时,这个软件还可以进一步扩展,例如“同时设置多个闹钟”、“信息分享”、“应用推荐”等,使功能更加强大,带给用户更好的体验与便捷的生活服务。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 18 页 -