android应用学习总结

2024-04-09

android应用学习总结(精选8篇)

篇1:android应用学习总结

学习总结

Android具有开放性。有一下平台优势:

一、开放性

在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。

开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。

二、挣脱运营商的束缚

在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务。

互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。

三、丰富的硬件选择

这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,如同从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移。

四、不受任何限制的开发商

Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。

五、无缝结合的Google应用

在互联网的Google已经走过10历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。

总结了以上优点,但Android本身也有缺陷,千万不要钻太深和它较劲,走不过去的地方就想其他路绕,只要简约朴实不俗套,程序功能健壮就可以;另外多加几个Android开发者论坛社区下源码发帖求助,正所谓熟能生巧!

篇2:android应用学习总结

零零碎碎的总结:

1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来.3.要有自己的知识库,可以是一个工具类,把写过的,看过的好的代码放进去,也可以是一个笔记本软件.因为只有放在知识库里的东西,才是你最重要的财富.4.如果你想做自由职业者,你需要学英语,因为在国外的盈利比国内多很多.如果你想进大公司,好公司,你需要学英语.你想深入学习android,但中文的android文章太少了,你查查百度,到处都是copy来copy去的hellword,所以,你需要学英语.如果你想出国,你需要学英语.5.Http协议要研究透彻.http的信息头有什么信息,分别代表什么,信息体有什么信息,代表什么,都要搞的明明白白.scoket也是一样.6.在eclipse里的layout文件都有graphical Layout.通过这个好好的把UI调整好.7.Android里的junit每次运行都会打包新的apk到设备上跑.效率非常慢.如果是跟android无关的测试,最好自己建立一个单纯的java项目做测试.8.面试的时候不要觉得自己提的薪水太高,物以稀为贵明白吗?不管你的期望薪资多少,都有可能实现,这只是时间问题.9.如果一家小公司通过猎头找到你,即使公司在小,也比外面那些40,50人的公司还要好.不要觉得公司不行,担心会倒闭.放心吧,至少活1年是没问题的.10.不要把自己绑在android上,有空也研究下IOS(最近小弟就准备研究ios,刚买了6本书...).11.移动互联网最少还有10年的快速增长.android最少还有两年的快速增长.走android这条路是不会错的.12.有空多学点开放平台的SDK.比如新浪微博,腾讯微博,淘宝平台,支付宝移动支付平台,快钱移动支付平台等等..这些都是不愁没市场的.13.即使技术再差,也要发布一个应用到market上去.因为这样你才了解做一个应用的逻辑.14.每个月拿到薪水省500-1000元出来.这些钱投在买学习资料,去培训班上课...在培训班,花再多的钱也是值得的.15.你真正的价值在项目经验和对底层的认识上.不要忽略基础知识.16.如果有空把Android的源代码看一下.底层的东西很枯燥,但这些很值得学.17..程序员其实是艺术家.代码重构和设计模式,是非常非常重要的东西,必须要学

18.不要去维护一个项目,要去做一个项目.19.一开始不要轻易去大公司,虽然大公司是可以让你呆一辈子的.但你的起点低,以后成就也低.20:每天早上提前20分钟上班,5分钟把今天的工作计划写好.15分钟用来看各大It论坛的新闻.21:如果以前没做过java,那就把SSH看下,自己搭建一个小服务器.这是为了接私活用.22:PS一定要学,接私活用.23:多下载市面上好的应用,每天都用,只有这样你才能了解市场.现在所有的APK都可以反编译,看源代码麻烦,但看layout和图片很容易,所以....你懂的.24.要有羞耻心.25.老板仅仅要求你把东西做完,需求完成.但你必须对自己要更严格一点.写一段代码,从网上复制一份代码,并不是可以用就行了,你还必须明白他的原理,为什么这样就可以?这才是对你最有用的地方,这也是你今后薪资增长的保证.26.要懂得舍得.移动领域发展太快,必要时必须要用钱换时间.不然你会远远落后别人(我之前花了4000大洋去培训班学IOS三天).27.要明白自己想要什么,什么才能最大性价比提高你的能力.对我来说,能让我提高最大的,就是Android和IOS同时会,并且自己可以做架构设计.28.看android技术书籍最快的学习方法,先通读一次.然后把书本上的demo一个一个写出来.不要觉得太容易不去写.很多东西都是这样,看起来简单,但做起来难.最后再对照自己写出来的程序代码去理解书本的意思.29.应用和游戏是2个方向,没有一个公司会同时做游戏又做应用,即使是外包公司,大多也只做一块.专精一个就可以了.30.每次做完一个项目,要强迫自己做总结,通过这个项目,我学到了什么新技术?犯了哪些

SB错误?

篇3:android应用学习总结

1 移动平台总体设计

移动平台基于Android系统, 采用C/S模式结构。C/S模式结构充分利用了两端硬件环境的技术优势, 将任务合理的分配到客户端与服务器。降低了系统通讯开销。C语言移动学习系统主要遵循以下3项设计原则。

1.1 学习资源的微型化

在移动学习过程中, 学习者可能会处于一个嘈杂的环境之中, 所以学习过程难免会受外界干扰, 注意力集中的时间也相对较短。因此, 在移动学习系统的开发过程中, 一定要遵循“短小精悍”的原则, 尽量开发一些较简短的学习模块。学习单元的时间一般控制在10分钟左右, 同时每个学习单元之间的关联性不要太强, 也就是说这一单元的学习不会影响下一单元的学习效果[2]。

1.2 操作的简易性

当今的大学生使用最多的移动学习终端还是智能手机, 但智能手机存在屏幕小, 键盘小的缺点, 所以系统的功能性操作尽量的简单明了, 界面设计简单大方。这样学习者在使用移动学习系统时会更方便、快捷。

1.3 可扩展性和兼容性

移动学习系统的设计必须能够满足系统以后的内容扩展, 功能扩展和开放接口扩展等;系统不仅要适应高端的手机, 也要尽量兼容低端的手机, 保证这些手机用户在学校主页下载园地上能够下载移动学习系统客户端实现移动学习。

2 系统架构

图1为移动学习系统的系统构架, 由图1可以看出, 客户端基于HTTP协议访问通过Web服务并获取课程学习资源, 章节练习和模拟测试等信息。Web服务接收客户端要求, 访问数据库和资源库获取客户端需要的资源和信息, 并将处理结果返回给客户端。

移动学习系统采用MCV三层架构开发, 分别是用户层、业务逻辑层、数据操作层。第一层, 用户层主要进行平台界面的设计, 为用户提供欢迎界面;第二层, 业务逻辑层, 采用开源Tomcat搭建Web服务器层;第三层, 数据操作层, 主要负责存储获取数据, 服务器数据库采用My SQL搭建, 用于存储用户信息, 学习资源等。

Android客户端采用自带的一款轻型数据库SQLite3, SQLite3数据库可以保存客户端储存数据量较少的需求。客户端与服务器端两者之间通过HTTP协议进行通信, 数据通信格式使用的是XML或JOSN格式, 数据库采用My SQL5.4关系数据库管理系统, 此关系数据库不是将所有数据统一存放在一个大仓库内, 而是将数据分别保存在不同的表中, 这样做的目的就是增加了处理速度和灵活性[3]。

3 功能分析与实现

平台采用HBuilder为开发工具。HBuilder是DCloud推出的一款支持HTML5的Web开发IDE。通过完整的语法提示和代码输入法, 代码块等, 大幅度提升HTML, JS, CSS的开发效率。同时, 它还包括最全面的语法库和浏览器兼容性数据。HBuilder是当前最快的HTML开发工具, 强大的代码助手帮你快速完成开发, 最全的语法库和浏览器兼容性数据让浏览器碎片化不再头痛。

客户端为运行Android的移动学习系统, 通过Socket HTTP协议访问Web服务器, Web服务器通过访问MYSQL数据库获取相应的资源和信息来响应客户端的请求, 最后服务器将处理数据以JSON文本返回给客户端。Web服务器采用Tomcat7.0, 客户端使用Android4.0.3版本。

针对上述要求, 该平台由内容学习, 反馈练习和学习交流三大模块构成。

3.1 内容学习模块

内容学习模块是3个模块的重中之重。内容学习模块包括3个功能子模块, 分别是:课件学习、视频学习、消息查看;其中:课件学习主要是对教材的学习, 按章节编排好, 呈现给学生。材料有两部分构成:PPT及Word格式。这些教学资料存储在移动系统中, 在没有网络的情况下, 也可以进行移动学习, 不需要从服务器端口重新下载。

视频学习的内容是视频教学, 因为文件比较大, 需要储存在服务器上。当学生进行视频资源学习时, 学生客户端通过URL下载视频到系统中, 采用Android自带的Media Player播放器进行播放, 对于已经播放过一次的视频, 系统可以将其下载到系统缓存区中, 下次播放时就可以直接观看, 不需要再重新下载, 这样就可以节省流量的开销。

消息查看模块显示教师向学生推送的信息, 包括作业及各种提示信息等。

3.2 反馈练习模块

分为章节练习和模块测试两部分。章节练习是按章节向学生呈现各种类型的练习题 (包括选择题, 填空题, 编程题) , 让学生可以跟着课程进度进行练习。帮助学习者更有针对性的练习, 更适合初学者使用。模拟测试是向学生呈现总模拟题, 让学生在期末进行总复习, 查漏补缺。

3.3 学习交流模块

学习交流模块支持学生提出问题并浏览。学生和学生、学生和教师之间都可以进行交流学习。学生可以提出问题, 点击提交按钮, 服务端接收信息, 由教师处理学生提出的问题。

4 主要界面的原型设计

4.1 主界面

进入C语言课程学习系统首页, 就会出现如图2所示的欢迎界面。

4.2 学生学习界面

进入主界面后划动屏幕就可以进入到学生学习界面。

当用户选中“内容学习”后, 在上方出现“课件学习”“视频学习”两个选择项目 (如图3所示) 。选择“课件学习”按钮, 就会出现如图4所示界面。从中可以浏览教师上课讲课使用的教学资料, 以便帮助学生巩固复习, 加深记忆。选择“视频学习”按钮, 就会出现如图5所示的界面。在服务器中存储大量的视频教程, 有全国主讲C语言名师的视频, 也有上课教师所讲的视频, 供学生们查看。

如果进入到学生学习界面, 选择的是“反馈练习”, 就会出现如图6所示的界面。选择“章节练习”和“模拟练习”分别会出现如图7、图8所示的界面。

如果进入到学生学习界面, 选择的是“学习交流”按钮, 就会出现如图9所示的界面。

5 数据库设计

数据库是应用程序不可缺少的一个重要部分。在Android移动学习平台客户端中也需要进行数据的存储和交互, 因此数据库的设计是客户端设计的关键之处。

Android系统中集成了一个轻量级的数据库——SQLite。SQLite数据库只是一个文件, 并不需要安装和启动, 相当于嵌入式的数据库搜索引擎。适合于小存储量的设备中的数据的存取, 非常适合于移动终端这种便携设备。从本质上讲, SQLit的操作方式只是一种更为便捷的文件操作。在应用程序创建或打一个SQLite数据库, 并非是针对真正的数据库进行操作, 而只是对一个文件进行读写。由此可见, 手机中存在的数据库要求数据量和计算复杂度都不能很大, 只能对简单的、轻量级的数据进行存储和读取[4]。

6 结束语

本文针对我校计算机基础教学培养方案把移动学习引入到C语言课程当中, 设计了基于Android移动学习平台。我们可以把移动学习应用到其他课程当中, 将为其他课程教学开辟了一条新的道路。移动学习作为其他教学形式的有益补充, 以满足学习者随时地学习的需要, 也是高校改革的一个研究方向[5]。本文研究的移动学习平台有很多不足的地方, 我们将会继续优化、完善移动学习系统的功能, 为后期开发一个使用便捷, 功能丰富、体验良好、开发简洁的轻量级的移动应用程序提供了一种方法和思路。

参考文献

[1]石雪飞, 原艳霞.高等教育移动学习现状及未来发展[J].中国教育网络, 2015 (4) :35.

[2]汪敏.基于Android系统的智能手机移动学习软件的设计与开发[D].大连:辽宁师范大学, 2014.

[3]吕伟.基于Android的移动学习平台的设计与实现[D].南京:南京师范大学, 2013.

[4]刘宾.基于Android的《计算机文化基础》移动学习系统的设计与开发[D].济南:山东师范大学, 2013.

篇4:android应用学习总结

关键词:Android智能终端;移动学习;应用程序;设计

中图分类号:G434 文献标识码:A文章编号:1671-864X(2015)12-0184-01

移动学习是指在不固定时间和不固定地点,通过各种多媒体技术来满足学习者主动学习需求的一种新型学习方式。因移动学习具有移动性、个性化、情境性、协作性等特点,它已经成为高校信息化教学的一个重要方向。随着智能手机,平板电脑等智能终端与无线网络快速普及,智能终端已经成为移动学习的重要载体[1-2]。根据中国互联网信息中心2012年中国智能终端市场主流的操作系统调查结果显示,Android 操作系统凭借开源、开放的特性,占比55.4%,已经在智能操作系统中取得优势的领先地位[3]。基于此特点,本文设计了一种面向Android智能终端的移动学习应用程序(APP: applicaion),以现实移动学习过程、教学资源的整合、个性化学习过程。

一、应用程序开发工具的选择

目前,专业的Android 应用程序开发者常使用的开发工具为Eclipse+ADT+SDK,但是对于没有接触过面向对象程序编写的开发者而言,使用这种开发模式将是非常困难的。因此,本文选取了一种快速可靠的开发工具-App Inventor。

App Inventor是由谷歌公司所提供的一种在线可视化编写的Android 应用程序工具。App Inventor采用的是积木式图形拼接开发方式,通过自身强大的控件库和电子积木的拼接从而能够实现手机应用的开发,并且提供了在线模拟器,能够在线调试应用程序。通过这种简便且灵活的开发方式,避免了由不懂面向对象程序编写、调试带来的诸多不便[4-6]。

二、应用程序的设计

(一)设计原则。

本文设计的应用程序是针对移动智能终端的,所以设计程序时应考虑终端的特点以及程序的实用性(例如:屏幕大小、分辨率、输入方式、处理能力等)。因此,设计该程序时主要遵循了以下原则:良好的兼容性,系统易于扩展与升级、系统结构稳定性、实用性与安全性原则[7]。

(二)功能模块。

本应用的的主要功能是辅助学生自主学习,提供给学生一个学习的平台,应用的主要用户是教师与学生,教师是学习内容和信息的发布者,学生通过无线网络随时随地的学习。

1、登录模块。

进入应用以后,有注册和登录两个选项。如果用户选择登录,则需要输入用户名、密码和身份,如果用户名、密码、身份不匹配,则将弹出错误提示且清除已输入的信息,返回起始登录界面。如果用户选择注册,则需要输入用户名、密码、选择身份,然后点“注册”,如果用户名与数据库已有用户名重复,则提示注册失败,重新填写注册信息。

2、学生功能模块。

学生在注册、登录成功以后,就有权限对应用各项功能进行操作,学生功能模块主要有四个模块组成:课程学习、课程考核、过程统计、有问有答、公告栏。

课程学习:学生可以选择按章节和知识点进行操作。

课程考核:学生可以选择章节课后习题、模拟考试、错题集。选择“章节课后习题”,学生将按要求完成与章节内容相关的习题;选择“模拟考试”,学生将要完成在习题库随机抽选的若干道试题。“错题集”是收藏学生答错的习题。

过程统计:用于统计学生学习时间与答错试题的分布。

有问有答:用于学生与教师之间沟通交流。

公告栏:用于查看教师发布的通知。

3、教师功能模块。

教师在登录成功后,能够操作的功能模块有:有问有答、公告栏。

有问有答:用于教师查看、解决学生提出的问题,辅助学生完成学习。

公告栏:用于教师发布通知以及课程相关内容。

三、结束语

本文基于App inventor环境下,设计了一种面向Android智能终端的应用程序,用于学生的移动学习过程。应用还有诸多不足之处,比如:供学生和教师操作模块还较少,资源少,模块设计缺乏娱乐性,达不到寓教于乐;教师的数据管理功能有待强化等。

参考文献:

[1]黄有福. 移动学习在高职教育学习平台中的应用研究[J].广州职业教育论坛.2013.12(3):26-30.

[2]刘志.移动学习的现状以及评述[D].上海师范大学, 2012.

[3]李宏升,王宝红,吕臻. 基于智能终端的网络辅助学习系统的设计开发[J].河南科学.2013.31(7):978-988.

[4]卓树峰. 基于App Inventor的 Android 手机蓝牙通讯开发[J]. 福建信息技术教育2012.3(1).25-30.

[5]孙宇,管伟明.基于Appinventor 的混合气体测爆仪研究[J]. 中州煤炭.2014.22(6):33-42.

[6]郭守超,周睿,邓常梅等.基于App Inventor和计算思维的信息技术课堂教学研究中国电化教育2014.326(30):91-96.

[7]刘宾.基于Android的《计算机文化基础》移动学习系统的设计与开发[D].山东师范大学,2013.

篇5:android应用学习总结

BroadCast(广播),概念:一种在系统内进行通信的机制.通过这种机制,它能够将系统中的某个进程的信息或者意图传递到其他的对这些信息或者意图感兴趣的进程.广播发送者:想要主动传递自己的信息或者意图给系统或者特定的接收者,以便其作出响应.广播接收者:想要接收系统或者特定进程的某些信息或意图,以便作出相应的响应.Android广播机制包含三个基本要素: 广播(Broadcast)-----用于发送广播。

广播接收器(BroadcastReceiver)-----用于接收广播。

意图内容(Intent)-----用于保存广播相关信息的媒介。

广播的过程:首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用Context.sendBroadcast()、Context.sendOrderBroadcast()方法,把Intent对象以广播的方式发出去。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的Intentfilter是否与发送的Intent相匹配,若匹配就会调用BroadcastReceiver的void onReceive(Context curContext, Intent broadcastMsg)方法,onReceiver()方法执行完成后,BroadcastReceiver的实例就会销毁。

sendBroadCast():发送普通广播可以在同一时刻被所有接收者收到

优点:消息传递效率高

缺点:各个接收者之间无法通信,无法终止消息传播

sendOrderedBroadCast:发送有序广播

接收者将按预先声明的优先级依次接收广播消息 优先级设置: android:priority(-1000∽1000)数越大级别越高 也可调用IntentFilter对象的setPriority()设置

上一个接收者可往广播中压入数据传递给下一个接收者

任意一个接收者都可终止广播的传播,下一个就不能接收 注意:

如果找不到合适的BroadcastReceiver组件,应用不会有任何问题。onReceiver()方法不能在10秒执行完成,会认为该进程无响应。弹出ANR(application no response)的对话框。

源代码实例如下: 发送普通广播: Aactivity:

protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button =(Button)findViewById(R.id.button1);button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0){ Intent intent = new Intent();

intent.setAction(“com.coslay.action.CUSTOM_BROADCAST”);intent.putExtra(“msg”,“简单的消息”);sendBroadcast(intent);} });} 程序启动BroadcastReceiver只需要两步: 创建需要启动的BroadcastReceiver的Intent 调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的BroadcastReceiver BroadcastReceiver:

public class CustomReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1){

Toast.makeText(arg0, “接收到的Intent的Action为:”+arg1.getAction()+“n消息内容是:”+arg1.getStringExtra(“msg”), Toast.LENGTH_LONG).show();} 只要重写BroadcastReceiver的onReceive(Context context,Intent intent)方法即可。然后在如下注册监听器即可。

AndroidManifest.xml:

指定该BroadcastReceiver能匹配的Intent有两种方式: 1.使用代码进行指定: IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);SomeReceiver receiver = new SomeReceiver();registerReceiver(receiver,filter);2.在AndroidManifest.xml文件中配置。如上所示。发送有序广播: Aactivity:

button2 =(Button)findViewById(R.id.button2);button2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent();

intent.setAction(“com.coslay.action.SORTED_BROADCAST”);intent.putExtra(“msg”, “简单的消息”);sendOrderedBroadcast(intent, null);} });BroadcastReceiver:

public class SortedBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){

Toast.makeText(context, “接收到的Intent的Action为:”+intent.getAction()+“n消息内容是:”+intent.getStringExtra(“msg”), Toast.LENGTH_LONG).show();//创建一个Bundle对象,并存入数据 Bundle bundle = new Bundle();//将bundle存入结果中

bundle.putString(“first”, “第一个BroadcastReceiver存入的消息”);setResultExtras(bundle);//取消Broadcast的继续传播 //abortBroadcast();} } 优先接收到Broadcast的接收者可以通过 setResultExtras(bundle);方法将处理结果存入Broadcast中,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true)可以获取上一个接收者存入的数据。

AndroidManifest.xml:

接收系统广播(接收开机广播启动服务): BroadcastReceiver如下:

public class LaunchReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ Intent tIntent = new Intent(context , LaunchService.class);// 启动指定Service context.startService(tIntent);} } Service如下:

public class LaunchService extends Service { @Override public IBinderonBind(Intent intent){ return null;} @Override public void onCreate(){ // 定义1秒执行一行输出

new Timer().schedule(new TimerTask(){ @Override public void run(){ System.out.println(“-----” + new Date()+ “-----”);} }, 0, 1000);} } AndroidManifest.xml:

BroadcastReceiver可以实现Service与Activity之间的通信: Activity如下:

public class MusicBox extends Activity implements OnClickListener { // 获取界面中显示歌曲标题、作者文本框 TextView title, author;// 播放/暂停、停止按钮 ImageButton play, stop;ActivityReceiveractivityReceiver;public static final String CTL_ACTION = “org.crazyit.action.CTL_ACTION”;public static final String UPDATE_ACTION = “org.crazyit.action.UPDATE_ACTION”;// 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停 int status = 0x11;String[] titleStrs = new String[] { “心愿”, “约定”, “美丽新世界” };String[] authorStrs = new String[] { “未知艺术家”, “周蕙”, “伍佰” };

@Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取程序界面界面中的两个按钮

play =(ImageButton)this.findViewById(R.id.play);stop =(ImageButton)this.findViewById(R.id.stop);title =(TextView)findViewById(R.id.title);author =(TextView)findViewById(R.id.author);// 为两个按钮的单击事件添加监听器 play.setOnClickListener(this);stop.setOnClickListener(this);activityReceiver = new ActivityReceiver();// 创建IntentFilter IntentFilter filter = new IntentFilter();// 指定BroadcastReceiver监听的Action filter.addAction(UPDATE_ACTION);// 注册BroadcastReceiver registerReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);// 启动后台Service startService(intent);}

// 自定义的BroadcastReceiver,负责监听从Service传回来的广播 public class ActivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ // 获取Intent中的update消息,update代表播放状态 int update = intent.getIntExtra(“update”,-1);// 获取Intent中的current消息,current代表当前正在播放的歌曲 int current = intent.getIntExtra(“current”,-1);if(current >= 0){ title.setText(titleStrs[current]);author.setText(authorStrs[current]);} switch(update){ case 0x11: play.setImageResource(R.drawable.play);status = 0x11;break;// 控制系统进入播放状态 case 0x12: // 播放状态下设置使用暂停图标

play.setImageResource(R.drawable.pause);// 设置当前状态 status = 0x12;break;// 控制系统进入暂停状态 case 0x13: // 暂停状态下设置使用播放图标

play.setImageResource(R.drawable.play);// 设置当前状态 status = 0x13;break;} } }

@Override public void onClick(View source){ // 创建Intent Intentintent = new Intent(“org.crazyit.action.CTL_ACTION”);switch(source.getId()){ // 按下播放/暂停按钮 case R.id.play: intent.putExtra(“control”, 1);break;// 按下停止按钮 case R.id.stop: intent.putExtra(“control”, 2);break;} // 发送广播,将被Service组件中的BroadcastReceiver接收到 sendBroadcast(intent);} } Service的实例代码如下:

public class MusicService extends Service { MyReceiverserviceReceiver;AssetManager am;String[] musics = new String[] { “wish.mp3”, “promise.mp3”, “beautiful.mp3” };MediaPlayermPlayer;// 当前的状态,0x11 代表没有播放 ;0x12代表 正在播放;0x13代表暂停 int status = 0x11;// 记录当前正在播放的音乐 int current = 0;

@Override public IBinderonBind(Intent intent){ return null;}

@Override public void onCreate(){ am = getAssets();// 创建BroadcastReceiver serviceReceiver = new MyReceiver();// 创建IntentFilter IntentFilter filter = new IntentFilter();filter.addAction(MusicBox.CTL_ACTION);registerReceiver(serviceReceiver, filter);// 创建MediaPlayer mPlayer = new MediaPlayer();// 为MediaPlayer播放完成事件绑定监听器

mPlayer.setOnCompletionListener(new OnCompletionListener()//① { @Override public void onCompletion(MediaPlayermp){ current++;if(current >= 3){ current = 0;} // 发送广播通知Activity更改文本框

Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(“current”, current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent);// 准备、并播放音乐

prepareAndPlay(musics[current]);} });super.onCreate();}

public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent){ int control = intent.getIntExtra(“control”,-1);switch(control){ // 播放或暂停 case 1: // 原来处于没有播放状态 if(status == 0x11){ // 准备、并播放音乐

prepareAndPlay(musics[current]);status = 0x12;} // 原来处于播放状态 else if(status == 0x12){ // 暂停

mPlayer.pause();// 改变为暂停状态 status = 0x13;} // 原来处于暂停状态 else if(status == 0x13){ // 播放

mPlayer.start();// 改变状态 status = 0x12;} break;// 停止声音 case 2: // 如果原来正在播放或暂停

if(status == 0x12 || status == 0x13){ // 停止播放 mPlayer.stop();status = 0x11;} } // 发送广播通知Activity更改图标、文本框

Intent sendIntent = new Intent(MusicBox.UPDATE_ACTION);sendIntent.putExtra(“update”, status);sendIntent.putExtra(“current”, current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent);} }

private void prepareAndPlay(String music){ try { // 打开指定音乐文件

AssetFileDescriptorafd = am.openFd(music);mPlayer.reset();// 使用MediaPlayer加载指定的声音文件。mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());// 准备声音 mPlayer.prepare();// 播放

篇6:android学习方法总结

1.搭建环境:包括对Java和Eclipse及模拟器(有真机再好不过)的熟悉,对于android的tools和adb命令可以放到后面熟悉了解。

2.从helloworld开始:了解一个基本的android应用代码包含哪些,各部分做什么用。(这里只要先了解个大概就好)

3.activity、intent:了解activity是什么及其生命周期,intent是什么东西及它是基于消息机制。

4.掌握基础:这阶段你可以反复的修改及单步调试一个简单的程序,并学会logcat、单步调试、最基本的View、最简单的布局、进而对service、intentFilter等的熟悉 (以上4步骤推荐看深入浅出Google_Android.pdf这个电子书就够了)

篇7:android应用学习总结

public Object getSystemService(String name)

Parameters

nameThe name of the desired service.ReturnsThe service or null if the name does not exist.Open Declaration Object android.app.Activity.getSystemService(String name)

Return the handle to a system-level service by name.The class of the returned object varies by the requested name.Currently available names are:

Note: System services obtained via this API may be closely associated with the Context in which they are obtained from.In general, do not share the service objects between various different contexts(Activities, Applications, Services, Providers, etc.)

译文:通过这个接口获取到的System services(系统服务)会和他们相应的Context(上下文)有紧密联系。通常,不要在不同的上下文中(Activities, Applications, Services, Providers,etc.)共享同一个System services对象。

---------》WINDOW_SERVICE(“window”)

The top-level window manager in which you can place custom windows.The returned object is a WindowManager.使用方法,例如:

DisplayMetrics metrics = new DisplayMetrics();

WindowManager wm =(WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);

Display d = wm.getDefaultDisplay();

d.getMetrics(metrics);

addResult(SCREEN_WIDTH, metrics.widthPixels);

addResult(SCREEN_HEIGHT, metrics.heightPixels);

addResult(SCREEN_DENSITY, metrics.density);

addResult(SCREEN_X_DENSITY, metrics.xdpi);

addResult(SCREEN_Y_DENSITY, metrics.ydpi);

注意addResult是自定义函数。

其中DisplayMetrics还可以这样使用,DisplayMetrics metrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metrics);

重点需要关注WindowManager的getDefaultDisplay用法。

---------》LAYOUT_INFLATER_SERVICE(“layout_inflater”)

A LayoutInflater for inflating layout resources in this context.例如:

final LayoutInflater mInflater;

mInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

public View getView(int position, View convertView, ViewGroup parent){

View view;

if(convertView == null){

view = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);

} else {

view = convertView;

}

bindView(view, mList.get(position));

return view;

}

注意其中的inflate方法。

---------》ACTIVITY_SERVICE(“activity”)

A ActivityManager for interacting with the global activity state of the system.使用方法,例如:

public AppListAdapter(Context context){

mContext = context;

ActivityManager am =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

List appList = am.getRunningAppProcesses();

for(ActivityManager.RunningAppProcessInfo app : appList){

if(mList == null){

mList = new ArrayList();

}

mList.add(new ListItem(app));

}

if(mList!= null){

Collections.sort(mList, sDisplayNameComparator);

}

}

注意getRunningAppProcesses()方法。

---------》POWER_SERVICE(“power”)

A PowerManager for controlling power management.例如:

PowerManager pm =(PowerManager)context.getSystemService(Context.POWER_SERVICE);

pm.goToSleep(SystemClock.uptimeMillis());

注意goToSleep()方法。

再如:

private WakeLock mWakeLock = null;

mWakeLock = mPm.newWakeLock(PowerManager.FULL_WAKE_LOCK, “ConnectivityTest”);

mWakeLock.acquire();

(mWakeLock.release();)

---------》ALARM_SERVICE(“alarm”)

A AlarmManager for receiving intents at the time of your choosing.例如:

设置闹钟

private void scheduleAlarm(long delayMs, String eventType){

AlarmManager am =(AlarmManager)getSystemService(Context.ALARM_SERVICE);

i.putExtra(TEST_ALARM_EXTRA, eventType);

i.putExtra(TEST_ALARM_ON_EXTRA, Long.toString(mSCOnDuration));

i.putExtra(TEST_ALARM_OFF_EXTRA, Long.toString(mSCOffDuration));

i.putExtra(TEST_ALARM_CYCLE_EXTRA, Integer.toString(mSCCycleCount));

PendingIntent p = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+ delayMs, p);}

---------》NOTIFICATION_SERVICE(“notification”)

A NotificationManager for informing the user of background events.用于显示通知栏,例如如下经典函数:

protected void showNotification(){

// look up the notification manager service

//创建NotificationManager

NotificationManager nm =(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

// The details of our fake message

//显示的信息,title和content

CharSequence from = “Joe”;

CharSequence message = “kthx.meet u for dinner.cul8r”;

// The PendingIntent to launch our activity if the user selects this notification

//点击事件的相应窗口

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(this, IncomingMessageView.class), 0);

// The ticker text, this uses a formatted string so our message could be localized

String tickerText = getString(R.string.imcoming_message_ticker_text, message);

// construct the Notification object.Notification notif = new Notification(R.drawable.stat_sample, tickerText,System.currentTimeMillis());

// Set the info for the views that show in the notification panel.notif.setLatestEventInfo(this, from, message, contentIntent);

// after a 100ms delay, vibrate for 250ms, pause for 100 ms and

// then vibrate for 500ms.notif.vibrate = new long[] { 100, 250, 100, 500};

// Note that we use R.layout.incoming_message_panel as the ID for

// the notification.It could be any integer you want, but we use

// the convention of using a resource id for a string related to

// application.nm.notify(R.string.imcoming_message_ticker_text, notif);

}

---------》KEYGUARD_SERVICE(“keyguard”)

A KeyguardManager for controlling keyguard.键盘锁,例如:

KeyguardManager keyguardManager =

(KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);

if(keyguardManager.inKeyguardRestrictedInputMode()){

return false;

}

---------》LOCATION_SERVICE(“location”)

A LocationManager for controlling location(e.g., GPS)updates.得到位置信息,例如:

LocationManager locationManager =(LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);Location location = null;

List providers = locationManager.getAllProviders();

for(int i = 0;i < providers.size();++i){

String provider = providers.get(i);

location =(provider!= null)? locationManager.getLastKnownLocation(provider): null;

if(location!= null)

break;

}

---------》SEARCH_SERVICE(“search”)

A SearchManager for handling search.创建搜索服务,例如:

SearchManager searchManager =

(SearchManager)context.getSystemService(Context.SEARCH_SERVICE);

ComponentName name = searchManager.getWebSearchActivity();

if(name == null)return null;

SearchableInfo searchable = searchManager.getSearchableInfo(name);

if(searchable == null)return null;

---------》VIBRATOR_SERVICE(“vibrator”)

A Vibrator for interacting with the vibrator hardware.提供震动服务,例如:

private static final SparseArray sVibrationPatterns = new SparseArray();

static {

sVibrationPatterns.put(AccessibilityEvent.TYPE_VIEW_CLICKED, new long[] {

0L, 100L

sVibrationPatterns.put(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED, new long[] {

0L, 100L

});

sVibrationPatterns.put(AccessibilityEvent.TYPE_VIEW_SELECTED, new long[] {

0L, 15L, 10L, 15L

});

sVibrationPatterns.put(AccessibilityEvent.TYPE_VIEW_FOCUSED, new long[] {

0L, 15L, 10L, 15L

});

sVibrationPatterns.put(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, new long[] {0L, 25L, 50L, 25L, 50L, 25L

});

sVibrationPatterns.put(INDEX_SCREEN_ON, new long[] {

0L, 10L, 10L, 20L, 20L, 30L

});

sVibrationPatterns.put(INDEX_SCREEN_OFF, new long[] {

0L, 30L, 20L, 20L, 10L, 10L

});

}

private Vibrator mVibrator;

mVibrator =(Vibrator)getSystemService(Service.VIBRATOR_SERVICE);

Handler mHandler = new Handler(){

@Override

public void handleMessage(Message message){

switch(message.what){

case MESSAGE_VIBRATE:

int key = message.arg1;

long[] pattern = sVibrationPatterns.get(key);

mVibrator.vibrate(pattern,-1);

return;

case MESSAGE_STOP_VIBRATE:

mVibrator.cancel();

return;

}

}

};

---------》CONNECTIVITY_SERVICE(“connection”)

A ConnectivityManager for handling management of network connections.得到网络连接的信息,例如:

private boolean isNetworkConnected(){

NetworkInfo networkInfo = getActiveNetworkInfo();

return networkInfo!= null && networkInfo.isConnected();

}

private NetworkInfo getActiveNetworkInfo(){

ConnectivityManager connectivity =

(ConnectivityManager)getContext().getSystemService(Context.CONNECTIVITY_SERVICE);if(connectivity == null){

return null;

}

return connectivity.getActiveNetworkInfo();

}

---------》WIFI_SERVICE(“wifi”)

A WifiManager for management of Wi-Fi connectivity.例如:

进行wifi的打开,关闭,状态判断等。

private WifiManager mWm;

mWm =(WifiManager)getSystemService(Context.WIFI_SERVICE);

创建两个View单击事件的监听器,监听器实现onClick()方法:

private View.OnClickListener mEnableWifiClicked = new View.OnClickListener(){

public void onClick(View v){

mWm.setWifiEnabled(true);

}

};

private View.OnClickListener mDisableWifiClicked = new View.OnClickListener(){

public void onClick(View v){

mWm.setWifiEnabled(false);

}

};

---------》INPUT_METHOD_SERVICE(“input_method”)

An InputMethodManager for management of input methods.得到键盘或设置键盘相关信息,例如:

private void hideSoftKeyboard(){

// Hide soft keyboard, if visible

InputMethodManager inputMethodManager =(InputMethodManager)

getSystemService(Context.INPUT_METHOD_SERVICE);

inputMethodManager.hideSoftInputFromWindow(mList.getWindowToken(), 0);

}

---------》UI_MODE_SERVICE(“uimode”)

An UiModeManager for controlling UI modes.UI信息相关,例如:

int mUiMode = Configuration.UI_MODE_TYPE_NORMAL;

try {

IUiModeManager uiModeService = IUiModeManager.Stub.asInterface(ServiceManager.getService(Context.UI_MODE_SERVICE));

mUiMode = uiModeService.getCurrentModeType();

} catch(RemoteException e){

---------》DOWNLOAD_SERVICE(“download”)

A DownloadManager for requesting HTTP downloads

下载相关的接口,例如:

private void downloadUpdate(Context context, String downloadUrl, String fileName){

LogUtil.i(TAG, “downloadUpdate downloadUrl = ” + downloadUrl);

Uri downloadUri = Uri.parse(downloadUrl);

DownloadManager dm =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);Request downloadRequest = new Request(downloadUri);

//downloadRequest.setDescription(context.getText(R.string.upd_auto_check_prompt));

downloadRequest.setVisibleInDownloadsUi(true);//TODO:change to false when release!

//downloadRequest.setAllowedNetworkTypes(Request.NETWORK_WIFI);

downloadRequest.setDestinationInExternalPublicDir(“DoctorAn”, fileName);

downloadRequest.setTitle(context.getString(R.string.upd_downloading));

long downloadId = dm.enqueue(downloadRequest);

Map temp = new HashMap();

temp.put(“fileName”, fileName);

篇8:android应用学习总结

广州市司法职业学校隶属于广州市教育局, 是全国最早创建的五所法律中等专业学校之一。为了提高学校现代化教学的建设水平, 学校更新教育管理理念, 利用先进的网络技术、通信技术、计算机技术, 在先进的、高性能的新一代信息基础设施之上, 构建我校法律事务、社区法律服务、保安三个示范专业公共课程的精品课程资源以及虚拟仿真实训软件系统。传统的精品课程资源都是要通过计算机才能访问的, 如果离开了计算机, 课程的学习就无法进行。为了解决这个问题, 笔者提出了利用Android平台, 通过移动手机来访问精品课程学习资源, 这样可以在很大程度上提高学生学习的自主性和灵活性。

1.1 学校精品课程的建设现状

任何教学资源信息化的建设, 必然涉及到课程教学资源的开发、共享和管理。法学基础理论与实务、宪法基本理论与实务、刑法基本理论与实务、民法基本理论与实务等课程作为我校法律事务、社区法律服务、保安三个示范专业的公共基础课, 是学习人数最多, 使用范围最广的。目前我校教学资源信息化建设, 就是以示范专业公共课程为重点, 采用先进的多媒体交互技术手段, 建成了网络精品课程以及课程资源库, 实现学生通过校园网络, 随时可进行专业课程的交互学习;教师可通过课程资源库进行备课, 通过多种检索方式, 采用星树图展示课程的知识结构和教学媒体文件。目前由校内自主开发的精品课程已达140余课时, 师生反应教学效果好。

1.2 Android平台的选用

Android操作系统是Google推出的一个完整、开放的手机平台。Android支持wifi、WebKit浏览器, 拥有pushmail、Google等众多网络应用。另外, 由于Android操作系统是开源的, 所有厂商和个人都可以在其基础上进行开发, 开发商推出的Android设备[1]层数不穷, 尤其以手机设备为主, 目前基于Android平台的手机数量已经排名全球第一。经校内调研, 我校使用Android系统的学生手机用户已接近70%, 大部分学生的手机可以通过Android系统去访问各种资源, 这也是我们选用Android平台来开发精品课程学习系统的原因所在。

2. Android网络通信技术的实现

在基于Android平台的精品课程学习系统开发中, 如何才能让手机访问部署在学校机房服务器中的精品课程的数据, 最关键应解决的问题就是Android网络通信。下面将讲述精品课程学习系统Android通信技术实现的全过程。

2.1 Android通信系统的架构

我校精品课程学习系统的通信模块是采用的是分层的设计模式[2], 各层既相互独立而又相互协调地完成工作, 实现架构如下图1所示。

从图中可以看出第一层是应用程序层包括与电话相关的设备;第二层是应用框架, 为应用程序提供通信的接口;第三层是无线接口层 (RIL) , 负责数据的可靠传输、AT命令的发送以及反馈的解析;第四层是远程过程调用 (RPC) , 负责与基带处理器通信的控制和管理模块, RPC为一个传输层实体, 并与TCP, UDP等运输方式并存;第五层是共享内存驱动, 通信系统基带处理器与应用处理器之间是通过共享内存的方法来进行通信的。精品课程学习系统的整个通信机制就由这五个层来共同协调完成的[3]。

2.2 Socket通信的实现

在应用程序层中, 建立Socket的客户端程序, 另外在无线接口层 (RILD) 中建立一个Socket的服务器端程序。实现代码如下所示:

在RILD中建立的监控程序如下:

rd=socket_local_server (“RILD”, 0, 1) ;

socket_rd=Accept (rd, 0, 1) ;

Android平台系统中提供了socket_local_server的接口程序, 利用这个接口检测是否有新的消息, 然后通知系统建立新的Socket通信通道命名“RILD”。当Socket连线程启动后, 返回Socket的文件描述符rd。

当应用层提出连线时, 通过Accept () 函数接管客户端要求的连线, 以rd作为参数之一, 成功后返回新的文件描述符socket_rd, 并通过这个新的文件socket_rd来完成读写操作。

在应用程序框架层:

SS=new Loca1Socket () ;

l=new Loca1SocketAddress (“rild”, 0) ;

SS.Connect (l) :

上述的代码都是由Android的应用程序框架提供的, 首先在本地创建Socket客户端, 并发送了连接请求, 我们为了在无线接口层监控程序中建立的服务器相匹配在参数上进行了修改。在Socket通信线路建立后, 可以通过getInPutStream方法来获取无线接口层返回的数据, 并且可以通过getOutputStream () .write () 方法把数据传送给无线接口层[4]。

2.3 利用Android技术实现无线网络访问有线网络

通过Socket的技术实现了应用框架层与无线接口层之间的数据交换, 这是内层的数据交换过程。然而精品课程的资源是放在在有线互联网领域中的, 如何让移动设备去访问这些资源呢?这就要建立基于HTTP的手机等移动终端的B/S结构应用程序了。在Android系统中提供的HttpURLConnection和Http Client接口可以用来开发HTTP的应用程序[5]。

(1) HttpURLConnection

在HTTP通信中主要有两种访问的方式, 一种是POST;另一种是GET的请求方式。GET可以获得静态页面, 也可以把参数放在URL字符串后面, 传递给服务器。而POST方法的参数是放在HTTP请求中。部分实现代码如下所示:

URL url=new URL ("http://192.168.1.10:8088?par=123456") ;

HttpURLConnection urlConn= (HttpURLConnection) url openConnection () ;

InputStreamReader in=new InputStreamReader (urlConn.getInputStream () ) ;

//接下来对输入流进行处理。

(2) Apache HTTP客户端

使用Apache提供的Http Client接口可以进行HTTP操作。在Servlet编程中可以通过HttpServletRequest和HttpServletResponse来表示请求与响应。Apache HTTP客户端对请求与响应进行封装, 根据请求方法的不同, 得到HttpGet和HttpPost两个对象, 响应对象是HttpResponse, 使用DefaultHttpClient执行请求获得响应。部分实现代码如下所示:

String urlstr="http://192.168.1.10:8088/servlet/LoginServlet";

HttpPost Request=new HttpPost (urlstr) ;

2.4 通信数据加解密算法

为了加强手机访问数据的安全性, 在精品课程学习系统的通信过程中采用了AES的加密算法, AES算法具很高的随机性, 很强的扩散性能和抵抗分析攻击能力强。实现AES算法的程序对手机处理器内存等硬件的要求很低, 所以这个算法可以广泛在Android系统的智能手机上应用, 并且可以很大程度可以保证手机用户的账号和资金等方面的安全[6]。

3. 总结

我校以移动学习为目的所开发的精品课程学习系统, 对于学校教学资源信息化建设提出了新的内容和研究课题, 同时对于帮助学生从更多渠道获取学习信息具有非常重要的意义。移动学习是一个充满活力、孕育希望的研究领域, 如何让移动学习更好地为教学服务, 是值得我们广大教育者深思的问题。此外, 移动产品中大多数都是集成游戏软件, 给人们提供娱乐的资源, 而对于学习资源则相对较少。希望以后国家教育部门能在此领域给予更多的立项, 大力提倡移动学习, 让技术为学习服务, 开发出更多有利于学习的资源。

参考文献

[1]林永兴李晓蕾.基于Android的校园助手手机应用程序的研究与设计[J].硅谷.2012年3期.

[2]刘必刚.Android通信模块的设计与优化[D].武汉理工大学.2010年5月.

[3]董思博.基于Android平台的通信系统设计与实现[J].科技传播.2011年4期.

[4]黄星文.基于Android的手机通讯协议应用研究与实现[D].兰州大学.2010年4月.

[5]孙惠生.基于ASP.NET和Android技术的校外实习系统研究与开发[J].硅谷.2012年7期.

上一篇:两转两提下一篇:班书计