• 工作总结
  • 工作计划
  • 心得体会
  • 述职报告
  • 申请书
  • 演讲稿
  • 讲话稿
  • 领导发言
  • 读后感
  • 观后感
  • 事迹材料
  • 党建材料
  • 策划方案
  • 对照材料
  • 不忘初心
  • 主题教育
  • 脱贫攻坚
  • 调查报告
  • 疫情防控
  • 自查报告
  • 工作汇报
  • 党史学习
  • 当前位置: 达达文档网 > 文档下载 > 读后感 > 正文

    毕业论文(设计)基于安卓多功能时钟app设计与实现

    时间:2020-07-20 00:00:31 来源:达达文档网 本文已影响 达达文档网手机站

    目 录 摘 要 1 ABSTRACT 2 第1章 绪论 3 1.1 开发背景 3 1.2 研究现状 5 1.3 本文的主要工作 6 1.4 论文的组织结构 6 第2章 安卓相关介绍 7 2.1 安卓系统介绍 7 2.1.1 安卓技术简介 7 2.1.2 安卓应用程序组件 8 2.2 Android Studio简介 10 2.2.1架构组成 10 2.2.2主要功能 10 第3章 需求分析 12 3.1 多功能时钟的功能需求 12 3.2 多功能时钟的性能需求 13 第4章 多功能时钟的架构设计 14 4.1多功能时钟设计目标和原则 14 4.2多功能时钟的架构设计 14 4.3多功能时钟的功能设计 15 第5章 多功能时钟的详细设计与实现 18 5.1 界面设计 18 5.2 多功能时钟的功能设计 19 5.2.1显示时间功能 19 5.2.2闹钟功能 21 5.2.3计时器功能 27 5.2.4秒表功能 29 第6章 多功能时钟的实现与测试 32 6.1 多功能时钟的架构实现与测试 32 6.2 多功能时钟的模块实现与测试 32 结论 33 致谢 34 参考文献 35 附录 36 附录1 英文原文 36 附录2 中文译文 41 应用程序基础Android Developers 41 基于安卓的多功能时钟APP设计与实现 摘 要 随着移动通讯技术的快速发展逐渐趋于成熟以及手机、平板等各类智能设备用户数量的增长,应用逐渐趋向移动化,移动应用取得突飞猛进地发展,极大地改变了人们的日常生活。随着移动用户数量的增长,移动应用的开发与更新速度逐渐加快,移动应用也为各类智能终端用户提供了更方便、舒适和丰富多彩的生活。

    本应用是多功能时钟手机应用程序,使用的语言是java编程语言,开发平台是谷歌研发的Android开发环境Android Studio。本应用主要包括显示时钟功能,可以显示当前时间;
    闹钟功能,可以进行闹钟的添加和删除;
    计时器功能,可以添加倒计时时间、开始、暂停、继续和重置;
    秒表功能,可以开始、暂停、继续、记录、重置。

    首先,本文讨论了移动应用的开发背景、现状,接着进行了相关技术的介绍,然后分析了多功能时钟APP的功能和性能需求。在需求分析基础上,进行了多功能时钟APP的架构设计和实现。接着进行APP的详细设计,详细介绍了代码编写实现。在详细设计的基础上,给出了APP的实现、测试改进、调整优化。

    关键字:安卓;
    移动应用;
    多功能;
    时钟。

    ABSTRACT With the rapid development of mobile communication technology is gradually mature and smart devices of various types, such as mobile phones, tablet the growth of the number of users, application gradually incline to mobile, mobile application development by leaps and bounds, greatly changed People's Daily life. As the growth of the number of mobile users, mobile application development and update speed gradually speeding up, the mobile application also provides all kinds of intelligent terminal users with more convenient, comfortable and colorful life. This application is multi-functional clock mobile applications, the use of language is the Java programming language, development platform was developed by Google Android development environment Android Studio. This application is mainly including showing the clock function, it can display the current time. The alarm clock function, and you can make the alarm clock to add and delete; Timer function, you can add the countdown time, start, pause, continue, and reset; Stopwatch function, you can start, pause, continue, records, reset. First, this paper discusses the development of mobile application background, present situation, then has carried on the related technology is introduced, and then analyzes the functions of multi-functional clock APP and performance requirements. On the basis of demand analysis, has carried on the multi-functional clock APP architecture design and implementation. Then APP in the detailed design, coding are introduced in detail. On the basis of the detailed design and the realization of the APP, testing, adjusting and optimizing improvement. Keyword: android,mobile application,multi-function,clock 第1章 绪论 1.1 开发背景 在以前的10年里,世界电信发生了很大的改变,移动通信尤其是蜂窝小区的快速发展,使得用户彻底脱离了终端设备的限制,达到了比较完美的个人移动性,靠得住的传输信息手段和芯线对接方式。现在进入21世纪后,移动通信将逐步演化成社会发展和前进的不可缺少的工具。目前移动通信技术的发展分为第一代移动通信技术(1G)、第二代移动通信技术(2G)、第三代移动通信技术(3G)、第四代移动通信及其技术(4G)。

    1G是根据模拟进行传输的,它的特点是业务量比较小、安全性比较差、质量比较差、速度低、没有加密。1G的传输速率约2.4kbit/s。2G主要包括客户化应用移动网络增强逻辑(CMAEL)、支持最佳路由(S0)、立即计费、与全速率完全兼容的增强型话音编解码技术等,通话声音的质量得到了质的改变,数据传送速率可达115/384kbit/s。3G最基本的特征是智能信号处理技术,它可以提供前两代通信系统所不能提供的各种宽带信息业务。4G是结合3G与WLAN,并且可以进行高质量视频图像的传输。4G系统下载速度可以达到100Mbps,也可以以20Mbps的速度上传,并且可以达到绝大多数用户关于无线网络服务的需求。

    智能手机,其具有独立的操作系统和运行空间,用户可以自行安装第三方服务商提供的程序(软件、游戏、导航等),并且能够通过移动通讯网络来实现无线网络接入手机的类型。智能手机的使用范围已经遍布整个世界,但并不是每个人都知道、熟悉和使用。因为智能手机具有优秀的操作系统、可以自由地安装各类软件(仅限安卓系统)、完全大屏的全触屏式操作感这三大特性,所以完全终结了前几年的键盘式手机。其中谷歌(Google)、三星、宏达电(HTC)、苹果、诺基亚这五大品牌在全世界最被大众所知道,而华为(HUAWEI)、联想(Lenovo)、小米(MI)、魅族(MEIZU)、酷派(Coolpad)、金立(GIONEE)、中兴(ZTE)、一加手机(oneplus)、天宇(K-Touch)等品牌在中国备受关注。

    智能手机支持多种操作系统,如:谷歌的Android(中文:安卓/安致,全球第一大智能操作系统,占据全球智能手机操作系统市场79%左右的份额),苹果公司的IOS(全球第二大智能操作系统),微软公司的Windows Phone(全球第三大智能操作系统),RIM公司的黑莓(Blackberry,全球第四大智能操作系统),塞班公司的Symbian(全球第五大智能操作系统),三星集团的bada(全球第六大智能操作系统),魅族公司的Flyme OS系统等。

    智能手机具有六大特点:①具备无线接入互联网的能力:即需要支持GSM网络下的GPRS或者CDMA网络的CDMA1X或3G(WCDMA、CDMA-2000、TD-CDMA)网络,甚至4G(HSPA+、FDD-LTE、TDD-LTE)。②具有PDA的功能:包括PIM(个人信息管理)、日程记事、任务安排、多媒体应用、浏览网页。③具有开放性的操作系统:拥有独立的核心处理器(CPU)和内存,可以安装更多的应用程序,使智能手机的功能可以得到无限扩展。④人性化:可以根据个人需要扩展机器功能。根据个人需要,实时扩展机器内置功能,以及软件升级,智能识别软件兼容性,实现了软件市场同步的人性化功能。⑤功能强大:扩展性能强,第三方软件支持多。⑥运行速度快:随着半导体业的发展,核心处理器(CPU)发展迅速,使智能手机在运行方面越来越极速。

    安卓平板电脑(Android平板电脑)是搭载了谷歌Android操作系统的平板电脑,可以进行商务定制的一款定位于笔记本电脑与智能手机之间的移动商务终端,同时也是是一款携带方便而且通信功能完善而强大的移动数据终端。安卓平板电脑(Android 平板电脑)功能强大,不仅可搭载丰富的消费类娱乐应用,还可实现移动商务办公,随时随地可以使用无线上网,系统反应速度快,画面清晰细腻,触感轻柔敏锐,机身细薄,小巧玲珑,便于随身携带,比手提电脑更轻巧,比手机屏幕更宽广,但又具有手提电脑上网查询看电影看网页的功能,以及手机翻阅信息、收发邮件、拨打电话的功能。

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织。2011年8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一。

    Android系统目前已经布满我们生活的各个方面,如:手机、平板电脑、电视、电视盒子、游戏机、手表和车载系统等。随着Android系统的逐步发展,安卓应用如雨后春笋般出现,现实生活中需要很多物品才能实现的多个功能仅仅一个安卓应用就可以实现。在这里,通过编程实现多功能时钟,可以集手表、闹钟等功能于一体,使其简单、方便、实用。

    1.2 研究现状 Android系统自从出现以来,就以其开放性、丰富的硬件、便于开发等优势逐渐扩大自己的市场份额,尤其在国外,其呼声日高,正处于迅速发展的开拓阶段。2012年第一季度,在美国,基于Android系统的智能手机的销售量已占据整个美、美国手机销售量的28%份额,而IPhone手机的市场份额紧追其后。随着Android系统的不断发展和更新,选择Android系统的智能手机或者无线终端设备的人越来越多,人们对智能手机或设备的功能需求会越来越高,人们从应用商店里下载应用,同时对移动应用的功能的要求也会越来越高。

        安卓平台具有开发性,开发的平台允许任何移动终端厂商加入到安卓联盟中来,显著的开放性可以使其拥有更多的开发者;
    安卓具有开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。安卓平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。当前国内手机市场正在快速向智能手机推进,而安卓系统无疑是最大的市场需求。各种安卓应用商店的不断出现、发展和开发者的涌入,安卓平台的应用资源优势不断扩大。

    随着移动设备的制造和信息技术的不断发展,智能手机或者无线终端设备越来越普遍,各种各样的安卓应用的用户也越来越多。多功能时钟作为拥有一个简单而实用功能的安卓移动应用必将为人们的生活带来许许多多的便利。显示时间功能可以让你随时知道时间;
    闹钟功能可以提醒人们注意一些容易忽略的时间,可以让人们养成良好的作息习惯,可以提醒、通知等;
    计时器功能可以进行较短时间内的提醒鞥;
    秒表功能可以测量做某件事情的时间等。

    1.3 本文的主要工作 本文在现有的Android发展现状基础上,展示了一款基于安卓的移动应用-多功能时钟的构建的逻辑思路、系统架构以及各个功能的详细实现与调试过程。

    当安装后点击进入应用时,出现的是一个时钟界面,在界面中间显示的是当前设备的时间,精确到秒。在界面的上方,有“时钟”、“闹钟”、“计时器”、“秒表”功能。点击“闹钟”,此时界面中间是空白,下方有“添加闹钟”功能;
    点击“添加闹钟”,会出现一个时钟界面,上方的时间是当前的时间,精确到分;
    点击“时”,通过旋转时钟上的指针来选择“时”;
    点击“分”,通过旋转时钟上的指针来选择“分”,“确定”或“取消”;
    添加之后,长按添加的闹钟后,会提示“删除”,或取消。点击“计时器”,会出现“00:00:00”,依次点击,输入数字进行设定,精确到秒,点击“开始”进行倒计时,“暂停”、“继续”或“重置”。点击“秒表”,会出现“0:0:0:0”,点击“开始”进行计时,“记录”记录时间,“暂停”、“继续”或“重置”。本文是对这几个功能开发的详细介绍。

    1.4 论文的组织结构 第1章,绪论。主要描述的是基于安卓的多功能时钟的开发背景,安卓系统智能手机和平板电脑的发展现状。

    第2章,安卓相关介绍。介绍了安卓技术、安卓应用程序组件、Android Studio的架构组成和主要功能。

    第3章,需求分析。对多功能时钟的功能和性能进行需求分析,为后续设计做准备。

    第4章,多功能时钟的架构设计。描述了多功能时钟的设计目标和原则,介绍了多功能时钟的架构设计和功能设计,为详细设计提供参考。

    第5章,多功能时钟的详细设计与实现。介绍了多功能时钟的界面设计和各个功能的设计与实现。

    第6章,多功能时钟的实现与测试。介绍了多功能时钟的架构和模块的实现、测试与调试,并对出现的问题进行分析说明。

    第2章 安卓相关介绍 2.1 安卓系统介绍 2.1.1 安卓技术简介 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。

    1、应用程序层 Android会同一系列核心应用程序包一起发布,该应用程序包包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

    2、应用程序框架 开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;
    任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。隐藏在每个应用后面的是一系列的服务和系统, 其中包括:丰富而又可扩展的视图(Views),内容提供器(Content Providers),资源管理器(Resource Manager),通知管理器 (Notification Manager) ,活动管理器( Activity Manager) 。应用程序框架呢可以说是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性。其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不互相影响。开发应用时都是通过框架来与Android底层进行交互,接触最多的就是应用框架层。

    3、系统运行库 Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:系统 C 库(一个从BSD继承来的标准C系统函数库 Libc),媒体库(基于PacketVideo OpenCORE),Surface Manager(对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合), LibWebCore(一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图)
    4、Linux内核层 Android的核心系统服务基于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。Linux内核同时也作为硬件和软件栈之间的抽象层,它可隐藏具体硬件细节而为上层提供统一的服务。

    2.1.2 安卓应用程序组件 应用程序组件是Android应用程序的基本构建单元。每个组件是系统进入你的应用程序的不同入口点。不是所有的组件对于用户都是实际上的入口点,有些是互相依赖的,但是每个组件都有特定的作用——每个都是唯一的构建单元,这些构建单元定义你应用程序的全部行为。有四种不同类型的应用程序组件。每种都有不同的用处并且有不同的生命周期。生命周期定义了他们是怎样被创建和销毁的。Android开发四大组件分别是:活动(Activity):用于表现功能。服务(Service):后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider):
    支持在多个应用中存储和读取数据,相当于数据库。

    1、Activitiy Android 中,Activity是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。一个Activity代表一个单独的拥有用户界面的屏幕。比如,一个邮件应用程序可能拥有一个显示新邮件的列表的Activity,一个编写邮件的Activity,一个读邮件的Activity。虽然这些Activity一起工作,但是他们是相互独立的。因此一个不同的应用程序也可以启动这些Activity中的任何一个(如果邮件应用程序允许的话)。Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。一个Activity是由Activity类的子类来实现的。  2、Service Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。一个Service组件是运行在后台的一个进程,这个进程处理一个长时间的操作或者是一个远程调用。一个Service不需要提供一个用户界面。比如,一个Service可以在用户运行一个不同程序的同时在后台播放音乐,或者在不阻塞一个Activity的用户界面的同时获取网络数据。其他的组件,比如一个Activity,可以启动一个Service并且与之交互。一个Service是由Service的子类来实现的。

    3、BroadcastReceiver 在Android 中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。大量的广播都是由系统产生的。例如屏幕关闭的广播,电量不足的广播,拍了一张相片的广播。应用程序也可以发出广播,例如让其他应用程序知道一些数据已从网上下载了,并且它们可以使用这些数据。一个Broadcast receiver组件用于响应整个系统的广播通知。一个Broadcast receiver是由BroadcastReceiver的子类来实现的,并且每个广播都是当作一个Intent对象来传递的。

    4、Content Provider Content Provider 是Android提供的第三方应用数据的访问方案。一个Content provider管理一组共享的应用程序数据。你可以把这些数据存储到文件系统、一SQLite数据库、互联网或者任何你的应用程序可以访问的持久化存储设备中。通过Content provider其他的应用程序能够查询甚至修改(如果Content provider允许修改操作)这些数据。例如Android系统提供了管理联系人信息的Content provider。因此,任何一个应用程序在拥有相应权限的情况下都可以访问这个Content provider管理的数据(比如ContactsContract.Data)来读取或者修改某个联系人的信息。Content provider用于管理应用程序不与其他程序共享的的私有数据也是非常有用的。 一个Content Provider是由ContentProvider的子类来实现的,并且必须实现一组使其他应用程序能与之通信的API。

    2.2 Android Studio简介 2.2.1架构组成 在IDEA的基础上,Android Studio 提供:
    基于Gradle的构建支持;

    Android 专属的重构和快速修复;

    提示工具以捕获性能、可用性、版本兼容性等问题;

    支持ProGuard和应用签名;

    基于模板的向导来生成常用的 Android 应用设计和组件;

    功能强大的布局编辑器,可以让你拖拉UI控件并进行效果预览。

    2.2.2主要功能 2013年5月16日,在I/O大会上,谷歌推出新的Android开发环境——Android Studio,并对开发者控制台进行了改进,增加了五个新的功能。

    Android Studio是谷歌推出了新的Android开发环境,开发者可以在编写程序的同时看到自己的应用在不同尺寸屏幕中的样子。

    谷歌对开发者控制台进行了改进,增加了五个新的功能,包括优化小贴士、应用翻译服务、推荐跟踪、营收曲线图、用版测试和阶段性展示。

    1、优化小贴士:在主体中打开你的应用,点击小贴士,会得到这样的建议:为你的应用开发平板电脑版本。

    2、应用翻译服务:允许开发者直接在开发主体中获得专业的翻译。上传你的需求,选择翻译,其会显示翻译方和价格,并在一周内发回译本。

    3、推荐跟踪:允许开发者找出最有效的广告。

    4、营收曲线图:向开发者展示其应用营收,以国家进行划分。

    5、试用版测试和阶段性展示:开发者可以对应用进行测试,然后向测试用户推出,测试结果不会对外公布。当一个版本的测试结束,开发者可以向特定比例用户推出。

    Android Studio这款开发工具被首次公布,这也是为了方便开发者基于Android开发。

    首先解决的一个问题是多分辨率。Android设备拥有大量不同尺寸的屏幕和分辨率,根据新的Studio,开发者可以很方便的调整在各个分辨率设备上的应用。

    同时Studio还解决语言问题,多语言版本(但是没有中文版本)、支持翻译都让开发者更适应全球开发环境。Studio还提供收入记录功能。

    最大的改变在于Beta测试的功能。Studio提供了Beta Testing,可以让开发者很方便试运行。

    2015年5月29日,在谷歌I/O开发者大会上,谷歌发布AndroidStudio 1.3版,支持C++编辑和查错功能。Android Studio 1.3版开发码代码变得更加容易,速度提升,而且支持C++编辑和查错功能。

    第3章 需求分析 3.1 多功能时钟的功能需求 对于应用的设计目标,首要原则是以用户为本,宗旨是满足用户的需求。从用户的需求出发,多功能时钟这款基于安卓的移动应用应当包含日常生活中时钟的最基本的功能,能够显示当前时间,能够添加和删除闹钟,能够进行倒计时和能够进行秒表计时等。

    多功能时钟的设计需要根据系统功能的不同对应用进行模块划分,不同的功能独立出来形成一个模块,这样能够使我们更好的根据不同的模块不同特点有针对性地进行代码编写。根据应用的总体描述,这款应用的功能需求大致分为以下四部分。

    1、 查看时间的功能需求 查看时间对于每个时钟应用来说是一个最基本的功能,在设计多功能时钟的时候,为了方便用户查看时间,设计以数字来显示时间,简单明了。

    2、添加和删除闹钟的功能需求 多功能时钟设置闹钟时要制作一个“添加闹钟”的按钮,点击“添加闹钟”,会出现一个界面。界面下方是一个时钟,界面上方显示的是当前的时间。点击上方时间的“时”,下方时钟的指针是跳转到时的范围里,有两圈,一圈12小时;
    通过旋转时钟上的指针来选择“时”。点击上方时间的“分”,下方时钟的指针是跳转到分的范围里,有一圈,一圈60分钟;
    通过旋转时钟上的指针来选择“分”。在此界面还应有“确定”和“取消”两个按钮。此外还应有删除闹钟的功能,因此可以这样设计:添加闹钟之后,长按添加的闹钟,会弹出一个提示,提示“删除”或者“取消”。

    3、 计时器的功能需求 倒计时被人们广泛用于事件提醒。当你有事情需要在特定的时间完成或者到某个时间点要完成某件事情的时候。计时器功能可以提醒你按时完成所需要完成的工作。界面上方显示为“00:00:00”,可以输入数字进行设定,应可以精确到秒,界面下方应有一个“开始”按钮,点击“开始”进行倒计时,之后应有“暂停”“重置”按钮,点击“暂停”后,“暂停”按钮应变为“继续”按钮,计时器应可以进行倒计时。

    4、秒表的功能需求 秒表具有测量时间的功能,秒表的功能需求来源于需要精确计时的人群,人们可以用秒表测试自己的跑步速度,可以用秒表计算完成一项任务所需要的精确时间,可以用秒表测试自己呼吸频率、脉搏等等。界面上方显示为“0:0:0:0”,应可以精确到毫秒,界面下方应有一个“开始”按钮,点击“开始”进行计时,之后应有“暂停”和“记录”按钮,“记录”可以记录时间,点击“暂停”后,两个按钮应分别变为“继续”和“重置”按钮。

    3.2 多功能时钟的性能需求 手机应用要有好的发展空间,就需要能给用户提供良好的体验,而良好的用户体验是基于应用的性能的,一般从界面、操作、提示和响应速度等来评价应用的性能的。

    对于界面来说,不同的应用有着不同的要求。对于移动应用,需要在30秒到1分钟的时间内吸引用户。应用应当设计成,一看到应用就愿意使用,但这并不意味着需要复杂的界面,有可能只需要可以给用户提供细节内容就行了。对于多功能时钟的界面,应该是简单、突出主题。操作应该是简单,容易学会和上手。提示应该是简单明了,让用户一看就懂。对于多功能时钟,响应速度肯定是快速。

    第4章 多功能时钟的架构设计 4.1多功能时钟设计目标和原则 1、 实现时钟的基本功能,可以显示当前时间。

    2、 多功能性,实现闹钟、计时器、秒表功能。

    3、 易用性,界面良好,操作简单,容易上手。

    4、 可靠性,响应速度快,有一定的容错能力。

    4.2多功能时钟的架构设计 不论是ios还是android的应用开发,其实都遵循着一定的开发流程,只有如此才能使开发过程有章可循而不是一团乱。架构设计需要对应用的设计进行考虑,包括应用系统的基本处理流程、应用系统的组织结构、模块划分、功能分配、运行设计和出错处理设计等,为应用的详细设计提供基础。对于多功能时钟来说,首先要基于需求分析来制定开发流程,然后搭建应用的主框架,由于显示时间是最基础的功能,所以先实现显示时间功能,然后实现闹钟、计时器、秒表功能。由于应用是以时钟为最终应用的,所以应用初始界面设计为时钟的显示时间界面。主界面显示多功能时钟的所用功能,用户根据需求可以自主选择功能。图4-1 多功能时钟架构图。图4-2 多功能时钟开发流程,从上到下,从左到右依次进行。

    图4-1 多功能时钟架构图 图4-2 多功能时钟开发流程 4.3多功能时钟的功能设计 因为多功能时钟的各个功能之间是单独运行的,所以多功能时钟的每个功能都需要单独进行设计。已经确定架构设计后,对各个功能进行详细的设计。

    1、 时钟 对于时钟没有什么太大的要求,只要能显示当前时间就行了。当点击多功能时钟APP的快捷方式进入应用后,当前显示的应是时钟界面,时钟界面显示的是当前的时间。图4-3 时钟功能结构模型。

    图4-3 时钟功能结构模型 2、 闹钟 点击界面上方的“闹钟”按钮后,进入闹钟界面,当前闹钟界面是不存在闹钟的,在界面下方设置一个“添加闹钟”按钮,可以进行添加闹钟,点击后会出现一个稍微小一点的界面。界面下方设置为一个时钟,界面上方设计为闹钟显示的是当前的时间。设计为点击上方时间的“时”,下方时钟的指针设计为跳转到时的界面里(默认当前是在“时”的界面里);
    设计时钟有两圈,外圈为1-12,内圈为13-00;
    设计为通过旋转时钟上的指针来选择“时”。设计为点击上方时间的“分”,下方时钟的指针是跳转到分的界面里;
    设计时钟为一圈,一圈60分钟;
    设计为通过旋转时钟上的指针来选择“分”。在此界面还应有“确定”和“取消”两个按钮。此外还应有删除闹钟的功能,因此可以这样设计:添加闹钟之后,长按添加的闹钟,会弹出一个提示,操作提示“删除”或者“取消”。图4-4 闹钟功能结构模型。

    图4-4 闹钟功能结构模型 3、计时器 界面上方设计显示为“00:00:00”,可以输入数字进行设定,应可以精确到秒。界面下方设计一个“开始”按钮,点击“开始”进行倒计时。之后应设计“暂停”“重置”按钮,设计为点击“暂停”后,“暂停”按钮变为“继续”按钮。计时器应可以进行倒计时,可以在后台计时,时间到了,会弹出一个提示。图4-5 计时器功能结构模型 图4-5 计时器功能结构模型 4、秒表 界面上方设计显示为“0:0:0:0”,应可以精确到毫秒。界面下方设计有一个“开始”按钮,点击“开始”进行计时,之后应有“暂停”和“记录”按钮。设计“记录”按钮可以记录时间,点击“暂停”后,两个按钮应分别变为“继续”和“重置”按钮。图4-6 秒表功能结构模型 图4-6 秒表功能结构模型 第5章 多功能时钟的详细设计与实现 5.1 界面设计 主界面是进入应用时的界面,界面比较简单。图5-1 主界面布局,图5-2 安装界面。

    图5-1 主界面布局 图5-2 安装界面 搭建应用主框架,依次呈现时间、闹钟、计时器、秒表。代码如表5-1所示。

    表5-1 搭建应用主框架 android:id=“@+id/tabTime“ android:layout_width=“match_parent“ android:layout_height=“match_parent“ android:orientation=“vertical“ > android:id=“@+id/tabAlarm“ android:layout_width=“match_parent“ android:layout_height=“match_parent“ android:orientation=“vertical“ > android:id=“@+id/tabTimer“ android:layout_width=“match_parent“ android:layout_height=“match_parent“ android:orientation=“vertical“ > android:id=“@+id/tabStopWatch“ android:layout_width=“match_parent“ android:layout_height=“match_parent“ android:orientation=“vertical“ > 定义一个tabHost变量;
    初始化;
    给各个模块命名并且声明tab的内容。代码如表5-2所示。

    表5-2 给各个模块命名 tabHost = (TabHost) findViewById(android.R.id.tabhost); tabHost.setup(); tabHost.addTab(tabHost.newTabSpec(“tabTime“).setIndicator(“时钟“).setContent(R.id.tabTime)); tabHost.addTab(tabHost.newTabSpec(“tabAlarm“).setIndicator(“闹钟“).setContent(R.id.tabAlarm)); tabHost.addTab(tabHost.newTabSpec(“tabTimer“).setIndicator(“计时器“).setContent(R.id.tabTimer)); tabHost.addTab(tabHost.newTabSpec(“tabStopWatch“).setIndicator(“秒表“).setContent(R.id.tabStopWatch)); 5.2 多功能时钟的功能设计 5.2.1显示时间功能 多功能时钟的显示时间功能如图5-3所示。

    图5-3 显示时间功能 新建一个类TimeView,添加构造方法来被代码调用,被初始化器调用和在初始化的时候指定它的style。代码如表5-3所示。

    表5-3 添加构造方法 public TimeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);} public TimeView(Context context, AttributeSet attrs) { super(context, attrs);} public TimeView(Context context) { super(context);} 换成自己定义的类,在内部写一个TextView,指定它的id和textAppearance。代码如表5-4所示。

    表5-4 定义文本展现方式 <TextView android:id=“@+id/tvTime“ android:layout_width=“fill_parent“ android:layout_height=“fill_parent“ android:gravity=“center“ android:textAppearance=“?android:attr/textAppearanceLarge“ /> </com.example.administrator.myapplication.TimeView> 在类里添加一个事件,在初始化后执行TextView操作,呈现文字在中间。代码如表5-5所示。

    表5-5 呈现文字 protected void onFinishInflate() { super.onFinishInflate(); tvTime = (TextView) findViewById(R.id.tvTime); tvTime.setText(“Hello“); } protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility==View.VISIBLE) { timerHandler.sendEmptyMessage(0); }else{ timerHandler.removeMessages(0); private TextView tvTime; 重新刷新时间,通过sendEmptyMessage每秒刷新一次。代码如表5-6所示。

    表5-6 设置刷新时间间隔 timerHandler.sendEmptyMessage(0); private void refreshTime(){ Calendar c = Calendar.getInstance(); tvTime.setText(String.format(“%d:%d:%d“, c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND))); } 如果可见就呈现出来,否则把所有的消息移除掉。代码如表5-7所示。

    表5-7 设置文本可见与不可见处理方式 protected void onFinishInflate() { super.onFinishInflate(); tvTime = (TextView) findViewById(R.id.tvTime); tvTime.setText(“Hello“); timerHandler.sendEmptyMessage(0); } protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility==View.VISIBLE) { timerHandler.sendEmptyMessage(0); }else{ timerHandler.removeMessages(0); } } 呈现的为时间。代码如表5-8所示。

    表5-8 设置呈现的为时间 Calendar c = Calendar.getInstance(); tvTime.setText(String.format(“%d:%d:%d“, c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND))); 5.2.2闹钟功能 闹钟功能的添加闹钟界面如图5-4 和5-5所示。添加闹钟后如图5-6,闹钟的删除界面如图5-7所示,闹钟音乐播放如图5-8所示。

    图5-4 闹钟设置界面(时)
    图5-5 闹钟设置界面(分)
    图5-6 添加闹钟后 图5-7 闹钟的删除界面 图5-8 闹钟播放音乐 新建一个类,添加构造方法。代码如表5-9所示。

    表5-9 添加构造方法 public AlarmView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); public AlarmView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public AlarmView(Context context) { super(context); init(); 换成自己定义的类,在内部写一个ListView,可以呈现添加的按钮,添加文字为Add Alarm,提取到字符串中,指定id。代码如表5-10所示。

    表5-10 呈现文字 <ListView android:id=“@+id/lvAlarmList“ android:layout_width=“fill_parent“ android:layout_height=“0dp“ android:layout_weight=“1“ > </ListView> <Button android:id=“@+id/btnAddAlarm“ android:layout_width=“fill_parent“ android:layout_height=“wrap_content“ android:text=“@string/add_alarm“ /> </com.example.administrator.myapplication.AlarmView> 把两个变量加到类中,通过findViewById找到。给按钮添加一个事件。代码如表5-11所示。

    表5-11 添加事件 protected void onFinishInflate() { super.onFinishInflate(); btnAddAlarm = (Button) findViewById(R.id.btnAddAlarm); lvAlarmList = (ListView) findViewById(R.id.lvAlarmList); adapter = new ArrayAdapter<AlarmView.AlarmData>(getContext(), android.R.layout.simple_list_item_1); lvAlarmList.setAdapter(adapter); readSavedAlarmList(); btnAddAlarm.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { addAlarm(); } }); private Button btnAddAlarm; private ListView lvAlarmList; 定义闹钟响起的时间,在外界获取时间。指明一个data变量,来创建时间,实现闹钟列表。代码如表5-12所示。

    表5-12 实现闹钟列表 private static class AlarmData{ public AlarmData(long time) { this.time = time; date = Calendar.getInstance(); date.setTimeInMillis(time); timeLabel = String.format(“%d月%d日 %d:%d“, date.get(Calendar.MONTH)+1, date.get(Calendar.DAY_OF_MONTH), date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE)); } 设置闹钟的时间,设置闹钟时间判断,如果设置时间小于等于当前时间,直接加一天。闹钟可以显示月,日,时,分。代码如表5-13所示。

    表5-13 设置闹钟时间及判断 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Calendar currentTime = Calendar.getInstance(); if (calendar.getTimeInMillis()<=currentTime.getTimeInMillis()) { calendar.setTimeInMillis(calendar.getTimeInMillis()+24*60*60*1000); } AlarmData ad = new AlarmData(calendar.getTimeInMillis()); adapter.add(ad); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, ad.getTime(), 5*60*1000, PendingIntent.getBroadcast(getContext(), ad.getId(), new Intent(getContext(), AlarmReceiver.class), 0)); saveAlarmList(); 实现闹钟列表的存储,能够存储数据。代码如表5-14所示。

    表5-14 存储闹钟列表 StringBuffer sb = new StringBuffer(); for (int i = 0; i < adapter.getCount(); i++) { sb.append(adapter.getItem(i).getTime()).append(“,“); } if (sb.length()>1) { String content = sb.toString().substring(0, sb.length()-1); editor.putString(KEY_ALARM_LIST, content); System.out.println(content); }else{ editor.putString(KEY_ALARM_LIST, null); } 实现闹钟列表的读取,能够读取存储的数据。代码如表5-15所示。

    表5-15 读取闹钟列表 private void readSavedAlarmList(){ SharedPreferences sp = getContext().getSharedPreferences(AlarmView.class.getName(), Context.MODE_PRIVATE); String content = sp.getString(KEY_ALARM_LIST, null); if (content!=null) { String[] timeStrings = content.split(“,“); for (String string : timeStrings) { adapter.add(new AlarmData(Long.parseLong(string))); } } } 实现删除闹钟功能,能够进行闹钟的删除。代码如表5-16所示。

    表5-16 删除闹钟功能 AlarmData ad = new AlarmData(calendar.getTimeInMillis()); adapter.add(ad); public String toString() { return getTimeLabel(); } public int getId(){ return (int)(getTime()/1000/60); } AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.cancel(PendingIntent.getBroadcast(context, getResultCode(), new Intent(context, AlarmReceiver.class), 0)); 实现闹钟时间到了之后,音乐的播放。代码如表5-17所示。

    表5-17 播放音乐界面 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm_player_aty); mp = MediaPlayer.create(this, R.raw.music); mp.start(); } protected void onPause() { super.onPause(); finish(); } protected void onDestroy() { super.onDestroy(); mp.stop(); mp.release(); } 设计闹钟音乐播放界面的布局。代码如表5-18所示。

    表5-18 播放界面布局 android:textAppearance=“?android:attr/textAppearanceLarge“ android:layout_width=“fill_parent“ android:layout_height=“fill_parent“ android:gravity=“center“ android:text=“@string/play_sound“ /> 对播放进行注册和启动。代码如表5-19所示。

    表5-19 启动音乐播放 android:allowBackup=“true“ android:icon=“@drawable/ic_launcher“ android:label=“@string/app_name“ android:theme=“@style/AppTheme“ > <activity android:name=“com.example.administrator.myapplication.MainActivity“ android:label=“@string/app_name“ > <intent-filter> <action android:name=“android.intent.action.MAIN“ /> <category android:name=“android.intent.category.LAUNCHER“ /> </intent-filter> </activity> <receiver android:name=“AlarmReceiver“></receiver> <activity android:name=“PlayAlarmAty“ android:screenOrientation=“portrait“></activity> </application> Intent i = new Intent(context, PlayAlarmAty.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); 5.2.3计时器功能 计时器功能的初始界面如图5-9所示。设置时间如图5-10所示。暂停界面如图5-11所示。计时结束界面如图5-12所示。

    图5-9 计时器初始界面 图5-10 设置时间 图5-11 计时器暂停界面 图5-12 计时结束界面 在界面上呈现出“时”,分和秒类似。代码如表5-20所示。

    表5-20 显示“时” <EditText android:id=“@+id/etHour“ android:layout_width=“0dp“ android:layout_height=“wrap_content“ android:layout_weight=“1“ android:inputType=“number“ android:singleLine=“true“ android:textAppearance=“?android:attr/textAppearanceLarge“ /> <TextView android:layout_width=“wrap_content“ android:layout_height=“wrap_content“ android:text=“:“ android:textAppearance=“?android:attr/textAppearanceLarge“ /> 开始按钮的设置,暂停、继续、重置按钮类似。代码如表5-21所示。

    表5-21 按钮的设置 Button android:id=“@+id/btnStart“ android:layout_width=“0dp“ android:layout_height=“wrap_content“ android:layout_weight=“1“ android:text=“@string/start“ /> 初始化的操作,显示出“00:00:00”。代码如表5-22所示。

    表5-22 初始化 public void onClick(View v) { stopTimer(); etHour.setText(“0“); etMin.setText(“0“); etSec.setText(“0“); btnReset.setVisibility(View.GONE); btnResume.setVisibility(View.GONE); btnPause.setVisibility(View.GONE); btnStart.setVisibility(View.VISIBLE); } 对四个按钮的功能进行设置。代码如表5-23所示。

    表5-23 按钮功能的设置 btnPause = (Button) findViewById(R.id.btnPause); btnPause.setOnClickListener(new View.OnClickListener() { btnReset = (Button) findViewById(R.id.btnReset); btnReset.setOnClickListener(new View.OnClickListener() { btnResume = (Button) findViewById(R.id.btnResume); btnResume.setOnClickListener(new View.OnClickListener() { btnStart = (Button) findViewById(R.id.btnStart); btnStart.setOnClickListener(new View.OnClickListener() { 计时结束时弹出的界面设计。代码如表5-24所示。

    表5-24 计时结束 private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case MSG_WHAT_TIME_TICK: int hour = allTimerCount/60/60; int min = (allTimerCount/60)%60; int sec = allTimerCount%60; etHour.setText(hour+““); etMin.setText(min+““); etSec.setText(sec+““); 5.2.4秒表功能 秒表功能的初始界面如图5-13所示。开始计时的界面如图5-14所示。记录时间的界面如图5-15所示。暂停计时的界面如图5-16所示。

    图5-13 秒表初始界面 图5-14 开始计时 图5-15 记录时间 图5-16 暂停界面 对“时”的属性进行设置,“分”“秒”“微秒”类似。代码如表5-25所示。

    表5-25 “时”的属性 <TextView android:layout_width=“wrap_content“ android:layout_height=“wrap_content“ android:text=“:“ android:textAppearance=“?android:attr/textAppearanceLarge“ /> 初始化的操作,显示“00:00:00:00”代码如表5-26所示。

    表5-26 初始化 tvHour = (TextView) findViewById(R.id.timeHour); tvHour.setText(“0“); tvMin = (TextView) findViewById(R.id.timeMin); tvMin.setText(“0“); tvSec = (TextView) findViewById(R.id.timeSec); tvSec.setText(“0“); tvMSec = (TextView) findViewById(R.id.timeMSec); tvMSec.setText(“0“); 对暂停按钮的进行设置,开始、、继续、重置、记录的设置与其类似。代码如表5-27所示。

    表5-27 按钮的设置 btnPause = (Button) findViewById(R.id.btnSWPause); btnPause.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { stopTimer(); btnPause.setVisibility(View.GONE); btnResume.setVisibility(View.VISIBLE); btnLap.setVisibility(View.GONE); btnReset.setVisibility(View.VISIBLE); } } 第6章 多功能时钟的实现与测试 6.1 多功能时钟的架构实现与测试 对于多功能时钟的架构实现,主要体现在各个功能之间的切换。进入应用时,反应速度比较快,比较良好。在各个功能之间切换时,反应速度快,响应良好。

    对于快捷方式的图标,选择了可以直接看出应用主要功能的图标,方便用户寻找。对于界面的布局,比较简单、大众化,但可能有点单调。操作上还是比较简单的,用户可以快速的了解各个功能,达到了直观简便、操作简单、功能使用的应用设计的基本要求。

    6.2 多功能时钟的模块实现与测试 对于显示时间功能的实现,结果基本达到要求。进入应用时,处在时钟界面上,可以正确显示当前的时间,让用户能够直接看到当前时间,方便用户。需要改进的地方是此功能只能显示的当前所用设备的时间,不能进行时区的选择,这一点稍显不足,需要继续研究进行调整。

    对于闹钟功能的实现,整体效果比较好,可以进行闹钟的添加和删除,而且添加闹钟界面会显示一个时钟,比较新颖,能吸引用户。采用的删除方式是长按添加的闹钟,弹出提示进行删除,与直接添加一个删除按钮相比比较新颖,而且使画面看起来比较简约,可以存储闹钟数据。需要改进的地方是进行闹钟时间提示时,无法采用设备上的音乐,但整体效果还行。

    对于计时器功能的实现,效果比较好。可以进行时间的设定,倒计时、暂停、继续和重置。时间到了,会弹出提示。需要改进的地方是美观度不足。

    对于秒表功能的实现,结果基本令人满意。可以进行计时,精确到毫秒,暂停、继续、重置和记录时间。需要改进的地方是美观度不足。

    结论 在基于安卓的多功能时钟APP虽然是一个比较基础的安卓移动应用,但是它的实用性是比较强的,基本上是每种设备必带的应用。在时钟显示时间的功能的基础上,添加了闹钟、计时器和秒表功能。虽然有些功能并不完美,但是还是能给用户带来比较良好的体验,使得用户能够节省时间,简单操作。基础移动应用通常被人们所忽视,是因为一部分基础移动应用的实用性比较低,而且有可能受使用场合的限制,最主要的是基础移动应用的功能一般般,视觉效果并不是很好,并不能吸引用户的眼球,但我们不能忽视基础移动应用给用户带来的便利之处。我们要把基础移动应用进行改动调整,使其能够吸引用户的眼球,即使现在用户的注意力大多集中在社交软件、图书软件和游戏软件等。我们要使这些基础移动应用更好地为用户服务,丰富用户地生活。多功能时钟APP的开发使我得到了一个很好的学习安卓系统、应用开发的机会,通过学习和使用编程进行应用开发,对出现问题的解决,我受益匪浅。多功能时钟是一个可以方便用户生活的移动应用,我开发的这个应用还不是很完美,存在如:可以进行时区的选择等有待改进的地方。解决这些不足,需要进一步学习,规范和改进代码。

    致谢 在本文即将完成之际,回想本科阶段的学习生活和为毕业设计努力奋斗的这段时光,我衷心感谢我的指导老师杨公平教授。在完成毕业设计和毕业论文的这段时光里,杨公平老师对我们的问题有问必答,关心我们的完成进度,尽职尽责,信心指导我们在毕业设计和毕业论文中出现的问题,帮助我们改正并且完善毕业设计。杨老师平易近人,和蔼可亲,而且学识丰富,他深厚的理论素养、渊博的知识、严谨的治学态度、无私奉献的敬业精神,极大地感染了我们,我想这一切都会让我们感动铭记和受益终身的。杨老师对我的课程学习、课题研究、论文选题和撰写都给与了极大的关注和悉心指导,在此谨致以诚挚的敬意和衷心的感谢,并祝所有的老师培养出越来越多的优秀人才,桃李满天下!      深深地感谢呵护我成长的父母。每当我遇到困难的时候,父母总是第一个给我鼓励的人。回顾20多年来走过的路,每一个脚印都浸满着他们无私的关爱和谆谆教诲,10年的在外求学之路,寄托着父母对我的殷切期望。他们在精神上和物质上的无私支持,坚定了我追求人生理想的信念。父母的爱是天下最无私的最宽厚的爱。大恩无以言报,惟有以永无止境的奋斗,期待将来辉煌的事业让父母为之骄傲。我亦相信自己能达到目标。

    感谢我的朋友们,他们在一起度过了很多快乐,开心的日子。在他们的帮助下,我顺利的解决了生活中遇到的各种困难。

    感谢我的同学们,他们无私的帮助,帮助我解决了许多问题。  最后,感谢在我成长的过程中给予我帮助的所有老师、家人、朋友和同学们。

    参考文献 [1]高洪岩. Android学习精要. 北京:清华大学出版社,2012。

    [2]李兴华. Java开发实战经典. 北京:清华大学出版社,2009. [3]李兴华. Android开发实战经典. 北京:清华大学出版社,2012. [4][美]罗杰等. Android应用开发. 北京:人民邮电出版社,2010. [5]盖索林. Google Android开发入门指南. 北京:人民邮电出版社,2009. [6]靳岩,姚尚朗. Android开发入门与实战. 北京:人民邮电出版社,2009. [7]余志龙. Google Android SDK 开发范例大全(第2版)[M]. 北京:人民邮电出版社, 2010: 6-6. [8](美)Mark Murphy(李雪飞、吴明晖译). Beginning Android 2[M]. 北京:人民邮电出版社,2010. [9]李刚. 疯狂Android讲义. 北京:电子工业出版社,2015. [10]郭志宏. Android应用开发详解[M]. 北京:电子工业出版社, 2010. [11]邓凡平. 深入理解Android. 北京:机械工业出版社,2011. [12]王国辉,李伟等. Android开发宝典. 北京:机械工业出版社,2012. [13]Bruce Eckel .Thinking in java(java 编程思想)第四版.北京:机械工业出版社, 2011. [14](美) Cay S. Horstmann, Gary Cornell(陈昊鹏,王浩,姚建平等译). Java核心技术.卷Ⅱ.高级特性. 北京:机械工业出版社,2014. [15]Kathy Sierra, Bert Bates(O'Reilly Taiwan公司译). Head First Java:中文版. 北京:中国电力出版社,2007. [16]Kathy Sierra, Bert Bates. Head First Java.2nd ed. 北京:东南大学出版社,2005. [17]Ryan Cohen, Tao Wang. Android application development for the Intel® platform. [Berkeley, CA]:Apress,2014. 附录 附录1 英文原文 Application Fundamentals http://developer.android.com/guide/topics/fundamentals.html Android applications are written in the Java programming language. The compiled Java code — along with any data and resource files required by the application — is bundled by the aapt tool into an Android package, an archive file marked by an .apk suffix. This file is the vehicle for distributing the application and installing it on mobile devices; it's the file users download to their devices. All the code in a single .apk file is considered to be one application. In many ways, each Android application lives in its own world: 1. By default, every application runs in its own Linux process. Android starts the process when any of the application's code needs to be executed, and shuts down the process when it's no longer needed and system resources are required by other applications. 2. Each process has its own virtual machine (VM), so application code runs in isolation from the code of all other applications. 3. By default, each application is assigned a unique Linux user ID. Permissions are set so that the application's files are visible only to that user and only to the application itself — although there are ways to export them to other applications as well. It's possible to arrange for two applications to share the same user ID, in which case they will be able to see each other's files. To conserve system resources, applications with the same ID can also arrange to run in the same Linux process, sharing the same VM. Application Components A central feature of Android is that one application can make use of elements of other applications (provided those applications permit it). For example, if your application needs to display a scrolling list of images and another application has developed a suitable scroller and made it available to others, you can call upon that scroller to do the work, rather than develop your own. Your application doesn't incorporate the code of the other application or link to it. Rather, it simply starts up that piece of the other application when the need arises. For this to work, the system must be able to start an application process when any part of it is needed, and instantiate the Java objects for that part. Therefore, unlike applications on most other systems, Android applications don't have a single entry point for everything in the application (no main() function, for example). Rather, they have essential components that the system can instantiate and run as needed. There are four types of components: Activities An activity presents a visual user interface for one focused endeavor the user can undertake. For example, an activity might present a list of menu items users can choose from or it might display photographs along with their captions. A text messaging application might have one activity that shows a list of contacts to send messages to, a second activity to write the message to the chosen contact, and other activities to review old messages or change settings. Though they work together to form a cohesive user interface, each activity is independent of the others. Each one is implemented as a subclass of the Activity base class. An application might consist of just one activity or, like the text messaging application just mentioned, it may contain several. What the activities are, and how many there are depends, of course, on the application and its design. Typically, one of the activities is marked as the first one that should be presented to the user when the application is launched. Moving from one activity to another is accomplished by having the current activity start the next one. Each activity is given a default window to draw in. Typically, the window fills the screen, but it might be smaller than the screen and float on top of other windows. An activity can also make use of additional windows — for example, a pop-up dialog that calls for a user response in the midst of the activity, or a window that presents users with vital information when they select a particular item on-screen. The visual content of the window is provided by a hierarchy of views — objects derived from the base View class. Each view controls a particular rectangular space within the window. Parent views contain and organize the layout of their children. Leaf views (those at the bottom of the hierarchy) draw in the rectangles they control and respond to user actions directed at that space. Thus, views are where the activity's interaction with the user takes place. For example, a view might display a small image and initiate an action when the user taps that image. Android has a number of ready-made views that you can use — including buttons, text fields, scroll bars, menu items, check boxes, and more. A view hierarchy is placed within an activity's window by the Activity.setContentView() method. The content view is the View object at the root of the hierarchy. (See the separate User Interface document for more information on views and the hierarchy.) Services A service doesn't have a visual user interface, but rather runs in the background for an indefinite period of time. For example, a service might play background music as the user attends to other matters, or it might fetch data over the network or calculate something and provide the result to activities that need it. Each service extends the Service base class. A prime example is a media player playing songs from a play list. The player application would probably have one or more activities that allow the user to choose songs and start playing them. However, the music playback itself would not be handled by an activity because users will expect the music to keep playing even after they leave the player and begin something different. To keep the music going, the media player activity could start a service to run in the background. The system would then keep the music playback service running even after the activity that started it leaves the screen. It's possible to connect to (bind to) an ongoing service (and start the service if it's not already running). While connected, you can communicate with the service through an interface that the service exposes. For the music service, this interface might allow users to pause, rewind, stop, and restart the playback. Like activities and the other components, services run in the main thread of the application process. So that they won't block other components or the user interface, they often spawn another thread for time-consuming tasks (like music playback). See Processes and Threads, later. Broadcast receivers A broadcast receiver is a component that does nothing but receive and react to broadcast announcements. Many broadcasts originate in system code — for example, announcements that the timezone has changed, that the battery is low, that a picture has been taken, or that the user changed a language preference. Applications can also initiate broadcasts — for example, to let other applications know that some data has been downloaded to the device and is available for them to use. An application can have any number of broadcast receivers to respond to any announcements it considers important. All receivers extend the BroadcastReceiver base class. Broadcast receivers do not display a user interface. However, they may start an activity in response to the information they receive, or they may use the NotificationManager to alert the user. Notifications can get the user's attention in various ways — flashing the backlight, vibrating the device, playing a sound, and so on. They typically place a persistent icon in the status bar, which users can open to get the message. Content providers A content provider makes a specific set of the application's data available to other applications. The data can be stored in the file system, in an SQLite database, or in any other manner that makes sense. The content provider extends the ContentProvider base class to implement a standard set of methods that enable other applications to retrieve and store data of the type it controls. However, applications do not call these methods directly. Rather they use a ContentResolver object and call its methods instead. A ContentResolver can talk to any content provider; it cooperates with the provider to manage any interprocess communication that's involved. See the separate Content Providers document for more information on using content providers. Whenever there's a request that should be handled by a particular component, Android makes sure that the application process of the component is running, starting it if necessary, and that an appropriate instance of the component is available, creating the instance if necessary. Activating components: intents Content providers are activated when they're targeted by a request from a ContentResolver. The other three components — activities, services, and broadcast receivers — are activated by asynchronous messages called intents. An intent is an Intent object that holds the content of the message. For activities and services, it names the action being requested and specifies the URI of the data to act on, among other things. For example, it might convey a request for an activity to present an image to the user or let the user edit some text. For broadcast receivers, the Intent object names the action being announced. For example, it might announce to interested parties that the camera button has been pressed. There are separate methods for activating each type of component: 1. An activity is launched (or given something new to do) by passing an Intent object to Context.startActivity() or Activity.startActivityForResult(). The responding activity can look at the initial intent that caused it to be launched by calling its getIntent() method. Android calls the activity's onNewIntent() method to pass it any subsequent intents. One activity often starts the next one. If it expects a result back from the activity it's starting, it calls startActivityForResult() instead of startActivity(). For example, if it starts an activity that lets the user pick a photo, it might expect to be returned the chosen photo. The result is returned in an Intent object that's passed to the calling activity's onActivityResult() method. 2. A service is started (or new instructions are given to an ongoing service) by passing an Intent object to Context.startService(). Android calls the service's onStart() method and passes it the Intent object. Similarly, an intent can be passed to Context.bindService() to establish an ongoing connection between the calling component and a target service. The service receives the Intent object in an onBind() call. (If the service is not already running, bindService() can optionally start it.) For example, an activity might establish a connection with the music playback service mentioned earlier so that it can provide the user with the means (a user interface) for controlling the playback. The activity would call bindService() to set up that connection, and then call methods defined by the service to affect the playback. A later section, Remote procedure calls, has more details about binding to a service. 附录2 中文译文 应用程序基础Android Developers Android应用程序使用Java编程语言开发。aapt工具把编译后的Java代码连同应用程序所需的其他数据和资源文件一起打包到一个Android包文件中,这个文件使用.apk作为扩展名。此文件是分发并安装应用程序到移动设备的载体;
    是用户下载到他们的设备的文件。单一.apk文件中的所有代码被认为是一个应用程序。

    从多个角度来看,每个Android应用程序都存在于它自己的世界之中:
    1 默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中的任何代码需要被执行时,Android启动此进程,而当不再需要此进程并且其它应用程序又请求系统资源时,则关闭这个进程。

    · 2 每个进程都有其独有的虚拟机(VM),所以应用程序代码与所有其它应用程序代码是隔离运行的。

    3 默认情况下,每个应用程序均被赋予一个唯一的Linux用户ID,并加以权限设置,使得应用程序的文件仅对此用户及此应用程序可见——尽管也有其它的方法使得这些文件同样能为其他应用程序所访问。

    1 应用程序组件 Android的一个核心特性就是一个应用程序可以使用其它应用程序的元素(如果那个应用程序允许的话)。例如,如果你的应用程序需要显示一个图片卷动列表,而另一个应用程序已经开发了一个合用的而又允许别的应用程序使用的话,你可以直接调用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程序并没有吸纳或链接其它应用程序的代码。它只是在有需求的时候启动了其它应用程序的那个功能部分。

    为达到这个目的,系统必须能够在一个应用程序的任何一部分被需要时启动一个此应用程序的进程,并将那个部分的Java对象实例化。因此,不像其它大多数系统上的应用程序,Android应用程序并没有为应用程序提供一个单独的入口点(比如说,没有main()函数),而是为系统提供了可以实例化和运行所需的必备组件。一共有四种组件类型:
    1 Activity activity是为用户操作而展示的可视化用户界面。例如,一个activity可以展示一个菜单项列表供用户选择,戒者显示一些包含说明文字的照片。一个短消息应用程序可以包括一个用于显示要发送消息到的联系人列表的activity,一个给选定的联系人写短信的activity以及翻阅以前的短信或改变设置的其他activity。尽管它们一起组成了一个内聚的用户界面,但其中每个activity都不其它的保持独立。每一个都实现为以Activity类为基类的子类。

    一个应用程序可以只有一个activity,戒者,如刚才提到的短信应用程序那样,包含很多个。每个activity的作用,以及有多少个activity,当然是取决于应用程序及其设计的。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的。从一个activity转向另一个靠的是用当前的activity启动下一个。

    每个activity都被给予一个默认的窗口以进行绘制。一般情况下,这个窗口是满屏的,但它也可以是一个小的位于其它窗口之上的浮动窗口。一个activity也可以使用附加窗口——例如,一个在activity运行过程中弹出的供用户响应的对话框,戒是一个当用户选择了屏幕上特定项目后显示的必要信息的窗口。

    窗口显示的可视内容是由一系列层次化view构成的,这些view均继承自 View 基类。每个view均控制着窗口中一块特定的矩形区域。父级view包含并组织其子view的布局。叶节点view(位于层次结构最底端)在它们控制的矩形区域中进行绘制,并对用户直达其区域的操作做出响应。因此,view是activity与用户进行交互的界面。例如,view可以显示一个小图片,并在用户指点它的时候产生动作。Android有一些预置的view供开发者使用——包括按钮、文本域、滚动条、菜单项、复选框等等。

    view层次结构是由Activity.setContentView() 方法放入activity的窗口之中的。content view是位于层次结构根位置的View对象。(参见独立的用户界面文档以获取关于view及层次结构的更多信息。)
    2 Service service没有可视化的用户界面,而是在一段时间内在后台运行。例如,一个service可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取数据或者计算一些东西并提供给需要这个运算结果的activity使用。每个service都继承自Service基类。

    一个媒体播放器播放播放列表中的曲目是一个不错的例子。播放器应用程序可能有一个或多个activity来给用户选择歌曲并进行播放。然而,音乐播放这个任务本身丌应该由任何activity来处理,因为用户期望即使在他们离开播放器应用程序而开始做别的事情时,音乐仍在继续播放。为达到这个目的,媒体播放器activity可以启动一个运行于后台的service。系统将在这个activity不再显示于屏幕乀后,仍维持音乐播放service的运行。

    连接至(绑定到)一个正在运行的service(如果service没有运行,则启动之)是可能的。连接之后,你可以通过那个service暴露出来的接口不service进行通讯。对于音乐service来说,这个接口可以允许用户暂停、回退、停止以及重新开始播放。

    如同activity和其它组件一样,service运行于应用程序进程的主线程内。所以它不会对其它组件或用户界面有任何妨碍,它们一般会派生一个新线程来执行一些时间消耗型任务(比如音乐回放)。参见稍后的进程和线程。

    3 Broadcast receiver broadcast receiver是一个与注于接收广播通知信息,并做出相应处理的组件。许多广播是由系统代码产生的——例如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以发起广播——例如,通知其它应用程序一些数据已经下载到设备上并处于可用状态。

    一个应用程序可以拥有任意数量的broadcast receiver,以对所有它认为重要的通知信息予以响应。所有的receiver均继承自BroadcastReceiver基类。

    broadcast receiver没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者也可以使用NotificationManager来通知用户。通知可以用多种方式来吸引用户的注意力──闪动背光灯、震动设备、播放声音等等。通知一般是在状态栏上放一个持丽的图标,用户可以打开它并获取消息。

    4 Content provider content provider将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它有意丿的方式。content provider继承于ContentProvider 基类,实现了一套使得其他应用程序能够检索和存储它所管理的类型数据的标准方法。然而,应用程序并不直接调用返些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任何content provider进行会话;
    与其合作对任何相关的进程间通讯进行管理。

    参阅独立的Content Providers文档以获得更多关于使用content provider的信息。

    每当出现一个需要被特定组件处理的请求时,Android会确保那个组件的应用程序进程处于运行状态,必要时会启动它,并确保那个组件的一个合适的实例可用,必要时会创建那个实例。

    1.1激活组件:intent 当接收到ContentResolver发出的请求后,content provider被激活。而其它三种组件——activity、service和broadcast receiver,被一种叫做intent的异步消息所激活。intent是一个保存着消息内容的Intent对象。对于activity和service来说,它指明了所请求的操作名称,并指定了用来操作的数据的URI和其它一些信息。例如,它可以承载一个对一个activity的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于broadcast receiver来说,Intent对象指明了所通报的操作。例如,它可以对所有感兴趣的对象通报照相按钮被按下。

    对于每种组件来说,激活的方法是不同的:
    · 1 通过传递一IntentContext.startActivity()Activity.startActivityForResult(以启动(或指定新工作给)一个activity。相应的activity可以通过调用自身的 getIntent() 方法来查看最刜激活它的intent。Android通过调用activity的onNewIntent()方法来传递给它随后的任何intent。

    一个activity经常启动另一个activity。如果它期望它所启动的那个activity迒回一个结果,它会调用startActivityForResult()而不是startActivity()。例如,如果它启动了另外一个activity以使用户挑选一张照片,它也许想知道哪张照片被选中了。其结果将会被封装在一个Intent对象中,并传递给发出调用的activity的onActivityResult() 方法。

    2 通过传递一个Intent对象至Context.startService()以启动一个service(或向正在运行的service给出一个新的指令)。Android调用此service的 onStart()方法并将Intent对象传递给它。

    与此类似,一个intent可以被传递给 Context.bindService()以建立一个处于调用组件和目标service乀间的活动连接。此service会通过onBind() 方法的调用来获取此Intent对象(如果此service尚未运行,bindService()会先启动它)。例如,一个activity可以建立一个不前述的音乐回放service的连接,这样它就可以提供给用户一些途径(用户界面)来控制回放。这个activity可以调用 bindService()来建立此连接,然后调用service中定之的方法来控制回放。

    稍后的远程方法调用一节有关于如何绑定至一个service的更多细节。

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网