人人范文网 试用期工作总结

android开发试用期工作总结(精选多篇)

发布时间:2020-04-18 21:38:10 来源:试用期工作总结 收藏本文 下载本文 手机版

推荐第1篇:android 开发心得

即 使你的应用程序是快速且响应灵敏的,但一些设计仍然会给用户造成问题——与其它应用程序或对话框未事先计划的交互,意外的数据丢失,意料之外的阻塞等等。 避免这些问题,有助于理解应用程序运行的上下文和系统的交互过程,而这些又正影响着你的应用程序。简而言之,你应该竭尽全力去开发一个与系统和其它应用程 序流畅交互的应用程序。

一 个常见的流畅问题是,一个应用程序的后台处理——例如,一个 Service或者

BroadcastReceiver——弹出一个对话框来响应一些事件。这可能看起来没啥大碍,尤其是你在模拟器上单独地构建和测试你 的应用程序的时候。然而,当你的应用程序运行在真机上时,有可能你的应用程序在没有获得用户焦点时后台处理显示了一个对话框。因此,可能会出现在活跃的应 用程序后方显示了你的应用程序的对话框,或者从当前应用程序夺取焦点显示了一个对话框,而不管当前用户正在做什么(例如,正在打电话)。那种行为,对应用 程序或用户来说,就不应该出现。

为了避免这些问题,你的应用程序应该使用合适的系统资源来通知用户——Notification类。使用Notification,你的应用程序可以在状态栏显示一个 icon来通知用户已经发生的事情,而不是夺取焦点和打断用户。

另 一个流畅问题的例子是未能正确实现Activity的 onPause()和其它生命周期方法而造成意外丢失了状态或用户数据。又或者,如果你的应用程序想暴露数据给其它应用程序使用,你应该通过 ContentProvider来暴露,而不是(举例)通过一个可读的原始文件或数据库来实现。

这 些例子的共同点是它们都应该与系统和其它应用程序协作好。Android系统设计时,就把应用程序看作是一堆松散耦合的组件,而不是一堆黑盒代码。作为开 发者来说,允许我们把整个系统看作是更大的组件集合。这有益于我们可以与其它应用程序进行清晰无缝的集成,因此,作为回报,我们应该更好的设计我们的代 码。

下面将讨论常见的流畅问题以及如何避免它们:

一 定要记住Android是一个移动平台。可以显而易见地说,其它Activity(例如,“Incoming Phone Call”应用程序)可能会在任何时候弹出来遮盖你的Activity,记住这个事实很重要。因为这个过程将触发 onSaveInstanceState()和 onPause()方法,并可能导致你的应用程序

被杀死。

如 果用户在你的应用程序中正在编辑数据时,其它 Activity出现了,这时,你的应用程序被杀死时可能丢失那些数据。当然了,除非你事先保存了正在进行的工作。“Android方式”是这样做的:能 接收和编辑用户输入的 Android应用程序应该重写 onSaveInstanceState()方法,并以恰当的方式保存它们的状态。当用户重新访问应用程序时,她能得到她的数据。进行这种处理方式最经典的例子是 mail应用程序。如果用户正在输入 email,这时其它 Activity启动了,mail应用程序应该把正在编辑的email以草稿的方式保存起来。

如果你不想穿着内衣在大街上溜达的话,你的数据也不应该这样。尽管可能存在暴露应用程序的某种形式给其它应用程序,但这通常不是最好的主意。暴露原始数据,要求其它应用程序能够理解你的数据的格式;如果你变更了格式,那么,你将破坏那些没有进行同步更新的应用程序。

“Android 方式”是创建一个 ContentProvider,以一种清晰的、深思熟虑的和可维护的API方式暴露你的数据给其它应用程序。使用 ContentProvider,就好像是插入Java接口来分离和组装两片高耦合的代码。这意味着你可以修改数据的内部格式,而不用修改由 ContentProvider暴露的接口,这样,也不会影响其它应用程序。

如果用户正在运行一个应用程序(例如,Phone程序),断定对用户操作的目的才是安全的。这也就是为什么必须避免创建Activity,而是直接在当前的 Activity中响应用户的输入。那 就是说,不要在 BroadcastReceiver或在后台运行的 Service中调用 callActivity()。这么做会中断当前运行的应用程序,并导致用户恼怒。也许更糟糕的是,你的 Activity可能成为“按键强盗”,窃取了用户要提供给前一个 Activity的输入。视乎你的应用程序所做的事情,这可能是个坏消息。

不 选择在后台直接创建 Activity UI,取而代之的是,应该使用NotificationManager来设置 Notification。它们会出现在状态栏,并且用户可以在他空闲的时候点击它们,来查看你

的应用程序向他显示了什么。(注意,如果你的 Activity已经在前台了,以上将不适用:这时,对于用户的输入,用户期望的是看到下一个 Activity来响应)

如果你的应用程序需要执行一些昂贵或耗时的计算的话,你应该尽可能地将它挪到线程里。这将阻止向用户显示可怕的“Application Not Responding”对话框,如果不这样做,最终的结果会导致你的应用程序完全终止。

一 般情况下,Activity中的所有代码,包括它的 View,都运行在相同的线程里。在这个线程里,还需要处理UI事件。例如,当用户按下一个按键,一个 key-down事件就会添加到 Activity的主线程队列里。事件处理系统需要很快让这个事件出列并得到处理;如果没有,系统数秒后会认为应用程序已经挂起并为用户提供杀死应用程序 的机会。

如果有耗时的代码,内联在Activity上运行也就是运行在事件处理线程里,这在很大程度上阻塞了事件处理。这会延迟输入处理,并导致ANR对话框。为了避免这个,把你的计算移到线程里。

任 何值得使用的应用程序都可能有几个不同的屏幕。当设计UI屏幕时,请一定要使用多个Activity对象实例。 依赖于你的开发背景,你可能理解 Activity类似于 Java Applet,它是你应用程序的入口点。然而,那并不精确:Applet子类是一个 Java Applet的单一入口点,而一个Activity应该看作是你的应用程序多个潜在入口点之一。你的“main”Activity和其它之间的唯一不同点 是“main”Activity正巧是在AndroidManifest.xml文件中唯一对“android.intent.action.MAIN”动作感兴趣的Activity。 因此,当设计你的应用程序的时候,把你的应用程序看作是Activity对象的 集合。从长远来看,这会使得你的代码更加方便维护。

当 谈到 UI观感时,巧妙地交融非常重要。用户在使用与自己期望相反的 UI的应用程序时,会产生不愉快的感觉。当设计你的 UI时,你应该尽量避免太多自己的主题。相反的,使用同一个主题。你可以重写或扩展你需要的主题部分,但至少在与其它应用程序相同的 UI基础上开始。

不 同的 Android设备可能支持不同的屏幕分辨率。甚至一些可以自己变更分辨率,例如,切换到风景模式。确保你的布局和图片能足够灵活地在不同的设备屏幕上正 常显示。幸运的是,这很容易做到。简而言之,你需要做的是为主要分辨率提供不同版本的作品,然后为不同的尺寸设计你的布局。(例如,避免使用硬编码位置而 使用相对布局。)如果那样做的话,系统会处理剩下的部分,而且你的应用程序在任何设备上都看起来很棒。

Android设备会有多种网络连接选项。所有的都提供数据访问,但之间肯定有更快的。其中,速度最慢的是GPRS,GSM网络的非 3G数据服务。即使具备 3G能力的设备在非3G的网络上也会花费很多的时间,所以,网络很慢仍然是一个长期存在的事实。

这 就是为什么你应该按照最小化的网络访问和带宽来编写你的代码。你不能假设网络是快速的,所以,你应该总是计划它是慢的。如果你的用户碰巧在一个快速的网络 上,那很好——他们的用户体验会提升。你要避免相反的情形:在不同的地点和不同时间,应用程序有时可用,有时慢得令人抓狂,这样的程序可能不会受欢迎。

还 有一个潜在的地方是,如果你正在使用模拟器,那么你很容易受它迷糊,因为模拟器使用电脑的网络连接。这比手机网络快很多,所以,你需要修改模拟器设定来模 拟较低的网络速度。你可以在 Eclipse中做到这点,在启动选项的模拟器设置页里设置或者在启动模拟器时通过命令行选项设置。

Android 可以支持多种外观形状。也就是说,一些Android设备拥有全“QWERTY”键盘,而其它可能会有40键、12键或其它键盘设置。同样的,一些设备可 能有触摸屏,但一些也会没有。当创建你的应用程序的时候,记住这一点。不要假定特定的键盘布局——除非你真的想限定你的应用程序只运行在某些设备上。

如 果移动设备经常插在墙上,那么,它也就不是很“移动”。移动设备是电池供电的,如果我们能让每次充电的电池使用得更持久一些,那么每个人都会更加开心—— 尤其是用户。

其中两大耗电硬件是处理器和无线;这也就是我们为什么要写尽可能少做工作、尽可能少去使用网络的应用程序的重要原因。

如 何让你的应用程序最小化的占用处理器,归根结底还是要写高效代码。为了减少无线的电量消耗,确保对错误条件进行正确的处理,并只获取你要的东西。例如,如 果某一个网络操作失败了,不要不断地进行重试。如果失败了一次,有可能是用户不受欢迎,因此,如果你再以正确的方式操作,有可能还会失败;所有你做的都是 在浪费电池。

用户是相当聪明的:如果你的程序高耗电,他们是一定会发现的。到那个时点,你唯一可以确定的是,你的程序将很快被卸载掉。

推荐第2篇:Android 嵌入式开发心得体会

Android 嵌入式开发心得体会

刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发范例大全中的例子以及Android提供的APIDEMOS进行学习,尽管例子之间的连接比较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想,因为Android在现在也是全新的技术和框架,在其中我也学到了如何用单例模式、工厂模式等常用的设计模式进行学习,通过API进行开发客户端,对Request发送,Response处理中通过比较方便的JSON对象传输,以及对XML、JSON、图片、业务等下载处理,对API接口调用等问题处理,学习Android心得体会。首先在界面上,我们同样可以通过不同布局进行设计非常酷的界面,这些界面可以通过include进行引入,和jsp、html也有相通的地方,同样在android上可以用到自定义的样式这和c也有比较相通的地方,我们可以通过一些公用的方法写个BaseActivity这个基类,通过继承方式比较不错的实现了Activity的界面,因为这样你可以Header(头部)和Footer(尾部)进行处理一些触发事件或者特效等,布局模式以相对模式为主,线线布局模式可以在比较简单的include进行完成,最重要的一点就是:我们可以自己通过重写方法或者通过实现View或者Layout等类进行扩充项目需要的布局(或者控件),在学习界面中,我发现Android为我们提供了很好的类似反射机制,通过Layout文件夹下的配置文件,可以快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。对比较特殊的界面也可以通过处理嵌入到指定的界面,同样你可以通过java代码直接创建View进行添加,不过这种方式比较复杂。对一些点击、选中、按键等处理的事件,界面之间的跳转Intent管理,通过Bundle对数据在界面之间进行传输。其次在手机交互式通信服务中,学习了Android手机之间进行短信发送、广播、对广播的监听、服务等,在Service类中没有context,可以通过Handler来每秒反复运行,自动送出系统广播信息,同时在这里我们也知道可以设计一个常用的变量类,设计一个当前的CurrentActivity这个变量进行控制,进行处理。

总而言之,Android设计还是比较自由开阔的,只要有想法,自己动手便能实现。

推荐第3篇:Android项目开发总结

项目开发总结报告

1引言

1.1编写目的

总结开发经验与学习中的不足

1.2背景

以方便用户记录日常学习心得,生活体会为目的,进行主题为“随心笔记”的应用开发

2实际开发结果

2.1产品

2.2主要功能和性能

能够查看笔记的目录,记录笔记完成时间。能够改变主题颜色,目录排版方式,拥有简洁的主题。对于涂鸦功能,插入图片,密码锁等功能未能实现。

3开发工作评价

3.1对产品质量的评价

本应用拥有简单实用的功能,能够满足一般用户的需要

3.3对技术方法的评价

开发中使用了软件工程中的增量开发模型,黑盒测试等技术,使开发逐步向前发展

3.4出错原因的分析

对于部分Android版本支持性不好,不能正常使用安装等

2 4经验与教训

通过这次开发,我们体验了开发不易,需要很多人员的合作。开发过程中,必须明确整体目标,不能东一榔头,西一棒槌。另外由于学习时间短,对很多东西都不太了解,还好通过CSDN等一些网站能够找到有益的帮助,感谢那些博客,论坛。

推荐第4篇:Android开发知识点总结

由麦可网整理,转载请注明出处

Android开发知识点总结

1.如何让你的应用优先安装到SD卡上?

从Android 2.2 SDK开始多出了一个属性在AndroidManifest.xml中,在manifest节点加入android:installLocation=\"preferExternal\"即可,当然要想让你的应用真正的安装到SD卡上,用户最终的固件为2.2,同时用户选择安装时在SD卡上。一般只有大型游戏或非重要的系统级应用选择安装在SD卡上,SD卡的读写要慢于ROM且更费电,所以重要的应用,比如闹铃提醒是不能设置安装到SD卡的。

2.如何防止Service被系统回收?

对于Service被系统回收,一般做法是通过提高优先级可以解决,在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = \"1000\"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播,而Android123推荐大家如果你的应用很重要,可以考虑通过系统常用intent action来触发。

3.Android NDK本地应用效率提升方法

对于C/C++的应用,这里Android开发网提示按照C++的习惯,简单反复调用的函数可以声明为inline,尽量少用虚函数,C++ STL的Stream效率不是很高,vector的内存管理要考虑仅分配不释放问题,如果需要涉及和Java通讯,则JNI的执行开销比较大,同时IPC通讯方法在本地端使用IBinder比较高效,当然如果你的技术不是很过关,Socket也是可以的,也更规范些吧。

推荐第5篇:Android开发—四大组件

Android四大组件

Activity、Service、Broadcast Receiver、Content Provider

Activity

做一个完整的Android程序,不想用到Activity,真的是比较困难的一件事情,除非是想做绿叶想疯了。因为Activity是Android程序与用户交互的窗口,在我看来,从这个层面的视角来看,Android的Activity特像网站的页面。

Activity,在四大组件中,无疑是最复杂的,这年头,一样东西和界面挂上了勾,都简化不了,想一想,独立做一个应用有多少时间沦落在了界面上,就能琢磨清楚了。从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。对于开发者而言,就需要派生一个Activity的子类,然后埋头苦干上述事情。对于Activity的更多细节,先可以参见:reference/android/app/Activity.html。后续,会献上更为详尽的剖析。

Service

服务,从最直白的视角来看,就是剥离了界面的Activity,它们在很多Android的概念方面比较接近,都是封装有一个完整的功能逻辑实现,只不过Service不抛头露脸,只是默默无声的做坚实的后盾。但其实,换个角度来看,Android中的服务,和我们通常说的Windows服务,Web的后台服务又有一些相近,它们通常都是后台长时间运行,接受上层指令,完成相关事务的模块。用运行模式来看,Activity是跳,从一个跳到一个,呃...,这有点像模态对话框(或者还像web页面好了...),给一个输入(抑或没有...),然后不管不顾的让它运行,离开时返回输出(同抑或没有...)。而Service不是,它是等,等着上层连接上它,然后产生一段持久而缠绵的通信,这就像一个用了Ajax页面,看着没啥变化,偷偷摸摸的和Service不知眉来眼去多少回了。但和一般的Service还是有所不同,Android的Service和所有四大组件一样,其进程模型都是可以配置的,调用方和发布方都可以有权利来选择是把这个组件运行在同一个进程下,还是不同的进程下。这句话,可以拿把指甲刀刻进脑海中去,它凸显了Android的运行特征。如果一个 Service,是有期望运行在于调用方不同进程的时候,就需要利用Android提供的RPC机制,为其部署一套进程间通信的策略。

Android的RPC实现,如上图所示(好吧,也是从SDK中拿来主义的...),无甚稀奇,基于代理模式的一个实现,在调用端和服务端都去生成一个代理类,做一些序列化和反序列化的事情,使得调用端和服务器端都可以像调用一个本地接口一样使用RPC接口。

Android中用来做数据序列化的类是Parcel,参见:/reference/android/os/Parcel.html,封装了序列化的细节,向外提供了足够对象化的访问接口,Android号称实现非常高效。还有就是AIDL (Android Interface Definition Language) ,一种接口定义的语言,服务的RPC接口,可以用AIDL来描述,这样,ADT就可以帮助你自动生成一整套的代理模式需要用到的类,都是想起来很乏力写起来很苦力的那种。更多内容,可以再看看:guide/developing/tools/aidl.html,如果有兴致,可以找些其他PRC实现的资料lou几眼。关于Service的实现,还强推参看API Demos这个Sample里面的RemoteService实现。它完整的展示了实现一个Service需要做的事情:那就是定义好需要接受的Intent,提供同步或异步的接口,在上层绑定了它后,通过这些接口(很多时候都是RPC的...)进行通信。在RPC接口中使用的数据、回调接口对象,如果不是标准的系统实现(系统可序列化的),则需要自定义aidl,所有一切,在这个Sample里都有表达,强荐。Service从实现角度看,最特别的就是这些RPC的实现了,其他内容,都会接近于Activity的一些实现,也许不再会详述了。

Broadcast Receiver

在实际应用中,我们常需要等,等待系统抑或其他应用发出一道指令,为自己的应用擦亮明灯指明方向。而这种等待,在很多的平台上,都会需要付出不小的代价。比如,在Symbian中,你要等待一个来电消息,显示归属地之类的,必须让自己的应用忍辱负重偷偷摸摸的开机启动,消隐图标隐藏仸务项,潜伏在后台,监控着相关事件,等待转瞬即逝的出手机会。这是一件很发指的事情,不但白白耗费了系统资源,还留了个流氓软件的骂名,这真是卖力不讨好的正面典型。

在Android中,充分考虑了广泛的这类需求,于是就有了Broadcast Receiver这样的一个组件。每个Broadcast Receiver都可以接收一种或若干种Intent作为触发事件(有不知道Intent的么,后面会知道了...),当发生这样事件的时候,系统会负责唤醒或传递消息到该Broadcast Receiver,仸其处置。在此之前和这以后,Broadcast Receiver是否在运行都变得不重要了,及其绿色环保。这个实现机制,显然是基于一种注册方式的,Broadcast Receiver将其特征描述并注册在系统中,根据注册时机,可以分为两类,被我冠名为冷热插拔。所谓冷插拔,就是Broadcast Receiver的相关信息写在配置文件中(求配置文件详情?稍安,后续奉上...),系统会负责在相关事件发生的时候及时通知到该Broadcast Receiver,这种模式适吅于这样的场景。某事件方式 ->通知Broadcast ->启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶属于这种模式。而热插拔,顾名思义,插拔这样的事情,都是由应用自己来处理的,通常是在 OnResume事件中通过registerReceiver进行注册,在OnPause等事件中反注册,通过这种方式使其能够在运行期间保持对相关事件的关注。比如,一款优秀的词典软件(比如,有道词典...),可能会有在运行期间关注网络状况变化的需求,使其可以在有廉价网络的时候优先使用网络查询词汇,在其他情况下,首先通过本地词库来查词,从而兹顾腰包和体验,一举两得一石二鸟一箭双雕(注,真实在有道词典中有这样的

能力,但不是通过 Broadcast Receiver实现的,仅以为例...)。而这样的监听,只需要在其工作状态下保持就好,不运行的时候,管你是天大的网路变化,与我何干。其模式可以归结为:启动应用 ->监听事件 ->发生时进行处理。除了接受消息的一方有多种模式,发送者也有很重要的选择权。通常,发送这有两类,一个就是系统本身,我们称之为系统Broadcast消息,在reference/android/content/Intent.html 的Standard Broadcast Actions,可以求到相关消息的详情。除了系统,自定义的应用可以放出Broadcast消息,通过的接口可以是 Context.sendBroadcast,抑或是Context.sendOrderedBroadcast。前者发出的称为Normal broadcast,所有关注该消息的Receiver,都有机会获得并进行处理;后者放出的称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的只能吃前面吃剩下的,前面的心情不好私吞了,后面的只能喝西北风了。当Broadcast Receiver接收到相关的消息,它们通常做一些简单的处理,然后转化称为一条Notification,一次振铃,一次震动,抑或是启动一个 Activity进行进一步的交互和处理。所以,虽然Broadcast整个逻辑不复杂,却是足够有用和好用,它统一了Android的事件广播模型,让很多平台都相形见绌了。更多Broadcast Receiver相关内容,参见:/reference/android/content/BroadcastReceiver.html。

Content Provider

Content Provider,听着就和数据相关,没错,这就是Android提供的第三方应用数据的访问方案。在Android中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据库、文件、等等内容,都是不允许其他直接访问的,但有时候,沟通是必要的,不仅对第三方很重要,对应用自己也很重要。比如,一个联系人管理的应用。如果不允许第三方的应用对其联系人数据库进行增删该查,整个应用就失去了可扩展力,必将被其他应用抛弃,然后另立门户,自个玩自个的去了。Andorid当然不会真的把每个应用都做成一座孤岛,它为所有应用都准备了一扇窗,这就是Content Provider。应用想对外提供的数据,可以通过派生ContentProvider类, 封装成一枚Content Provider,每个Content Provider都用一个uri作为独立的标识,形如:content://com.xxxxx。所有东西看着像REST的样子,但实际上,它比REST 更为灵活。和REST类似,uri也可以有两种类型,一种是带id的,另一种是列表的,但实现者不需要按照这个模式来做,给你id的uri你也可以返回列表类型的数据,只要调用者明白,就无妨,不用苛求所谓的REST。另外,Content Provider不和REST一样只有uri可用,还可以接受Projection,Selection,OrderBy等参数,这样,就可以像数据库那样进行投影,选择和排序。查询到的结果,以Cursor(参见:reference/android/database/Cursor.html )的形式进行返回,调用者可以移动Cursor来访问各列的数据。

Content Provider屏蔽了内部数据的存储细节,向外提供了上述统一的接口模型,这样的抽象层次,大大简化了上层应用的书写,也对数据的整吅提供了更方便的途径。Content Provider内部,常用数据库来实现,Android提供了强大的Sqlite支持,但很多时候,你也可以封装文件或其他混吅的数据。在Android中,ContentResolver是用来发起Content

Provider的定位和访问的。不过它仅提供了同步访问的Content Provider的接口。但通常,Content Provider需要访问的可能是数据库等大数据源,效率上不足够快,会导致调用线程的拥塞。因此

Provider。

在各大组件中,Service和Content Provider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而Content Provider不论效率如何,都提供的是约定的同步访问接口。我想这遵循的就是场景导向设计的原则,因为Content Provider仅是提供数据访问的,它不能确信具体的使用场景如何,会怎样使用它的数据;而相比之下,Service包含的逻辑更复杂更完整,可以抉择大部分时候使用某接口的场景,从而确定最贴切的接口是同步还是异步,简化了上层调用的逻辑。 Android提供了一个AsyncQueryHandler(参见:reference/android/content/AsyncQueryHandler.html),帮助进行异步访问Content

推荐第6篇:Android蓝牙开发小结

学习之前先了解两个基本概念:

一、RFCOMM协议:

一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,为上层业务(如传统的串行线缆应用)提供了传送能力。

RFCOMM是一个简单传输协议,其目的是针对如何在两个不同设备上的应用之间保证一条完整的通信路径,并在它们之间保持一通信段。

RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM协议提供对基于L2CAP协议的串口仿真,基于ETSI07.10。可支持在两个BT设备之间同时保持高达60路的通信连接。

RFCOMM只针对直接互连设备之间的连接,或者是设备与网络接入设备之间的互连。通信两端设备必须兼容于RFCOMM协议,有两类设备:DTE (Data Terminal Endpoint,通信终端,如PC,PRINTER)和DCE (Data Circuit Endpoint,通信段的一部分,如Modem)。此两类设备不作区分。

二、MAC硬件地址

MAC(Medium/MediaAcce Control, 介质访问控制)MAC地址是烧录在NetworkInterfaceCard(网卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique,是识别LAN(局域网)节点的标识.24-47位是由厂家自己分配。其中第40位是组播地址标志位。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。

Android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备、寻找局域网内可能或者匹配的设备、连接设备和设备之间的数据传输。以下是建立蓝牙连接的所需要的一些基本类:

BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交互的的入口点。利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。

BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态。(其信息是封装在bluetoothsocket中)。

Bluetoothsocket类:代表了一个蓝牙套接字的接口(类似于tcp中的套接字),它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。

Blueboothserversocket类:代表打开服务连接来监听可能到来的连接请求(属于server端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket类将会返回一个bluetoothsocket。

Bluetoothcla类:描述了一个蓝牙设备的一般特点和能力。它的只读属性集定义了设备的主、次设备类和一些相关服务。然而,它并没有准确地描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。 下面说说具体的编程实现 1.启动蓝牙功能:

首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,以后你就可以使用该对象了。如果返回为空,the story is over。例如:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth } 其次,调用isEnabled()来查询当前蓝牙设备的状态,如果返回为false,则表示蓝牙设备没有开启,接下来你需要封装一个ACTION_REQUEST_ENABLE请求到intent里面,调用startActivityForResult()方法使能蓝牙设备,例如:

if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }

2.查找设备:

使用BluetoothAdapter类里的方法,你可以查找远端设备(大概十米以内)或者查询在你手机上已经匹配(或者说绑定)的其他手机了。当然需要确定对方蓝牙设备已经开启或者已经开启了“被发现使能”功能(对方设备是可以被发现的是你能够发起连接的前提条件)。如果该设备是可以被发现的,会反馈回来一些对方的设备信息,比如名字、MAC地址等,利用这些信息,你的设备就可以选择去向对方初始化一个连接。

如果你是第一次与该设备连接,那么一个配对的请求就会自动的显示给用户。当设备配对好之后,他的一些基本信息(主要是名字和MAC)被保存下来并可以使用蓝牙的API来读取。使用已知的MAC地址就可以对远端的蓝牙设备发起连接请求。

匹配好的设备和连接上的设备的不同点:匹配好只是说明对方设备发现了你的存在,并拥有一个共同的识别码,并且可以连接。连接上:表示当前设备共享一个RFCOMM信道并且两者之间可以交换数据。也就是是说蓝牙设备在建立RFCOMM信道之前,必须是已经配对好了的。

3.查询匹配好的设备:

在建立连接之前你必须先查询配对好了的蓝牙设备集(你周围的蓝牙设备可能不止一个),以便你选取哪一个设备进行通信,例如你可以你可以查询所有配对的蓝牙设备,并使用一个数组适配器将其打印显示出来:

Set pairedDevices = mBluetoothAdapter.getBondedDevices(); // If there are paired devices if (pairedDevices.size() >0) { //Loop through paired devices for (BluetoothDevice device : pairedDevices) { // Add the name and addre to an array adapter to show in a ListView mArrayAdapter.add(device.getName() + \"\\n\" + device.getAddre()); } 建立一个蓝牙连接只需要MAC地址就已经足够了。

4.扫描设备:

扫描设备,只需要简单的调用startDiscovery()方法,这个扫描的过程大概持续是12秒,应用程序为了ACTION_FOUND动作需要注册一个BroadcastReceiver来接受设备扫描到的信息。对于每一个设备,系统都会广播ACTION_FOUND动作。例如: // Create a BroadcastReceiver for ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // Add the name and addre to an array adapter to show in a ListView mArrayAdapter.add(device.getName() + \"\\n\" + device.getAddre()); } } }; // Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); // Don\'t forget to unregister during onDestroy 注意:扫描的过程是一个很耗费资源的过程,一旦你找到你需要的设备之后,在发起连接请求之前,确保你的程序调用cancelDiscovery()方法停止扫描。显然,如果你已经连接上一个设备,启动扫描会减少你的通信带宽。

5.使能被发现:Enabling discoverability 如果你想使你的设备能够被其他设备发现,将ACTION_REQUEST_DISCOVERABLE动作封装在intent中并调用startActivityForResult(Intent, int)方法就可以了。他将在不使你应用程序退出的情况下使你的设备能够被发现。缺省情况下的使能时间是120秒,当然你可以可以通过添加EXTRA_DISCOVERABLE_DURATION字段来改变使能时间(最大不超过300秒,这是出于对你设备上的信息安全考虑)。例如: Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); 运行该段代码之后,系统会弹出一个对话框来提示你启动设备使能被发现(此过程中如果你的蓝牙功能没有开启,系统会帮你开启),并且如果你准备对该远端设备发现一个连接,你不需要开启使能设备被发现功能,因为该功能只是在你的应用程序作为服务器端的时候才需要。

6.连接设备:

在应用程序中,想建立两个蓝牙设备之间的连接,必须实现客户端和服务器端的代码(因为任何一个设备都必须可以作为服务端或者客户端)。一个开启服务来监听,一个发起连接请求(使用服务器端设备的MAC地址)。当他们都拥有一个蓝牙套接字在同一RFECOMM信道上的时候,可以认为他们之间已经连接上了。服务端和客户端通过不同的方式或其他们的蓝牙套接字。当一个连接监听到的时候,服务端获取到蓝牙套接字。当客户可打开一个FRCOMM信道给服务器端的时候,客户端获取到蓝牙套接字。

注意:在此过程中,如果两个蓝牙设备还没有配对好的,android系统会通过一个通知或者对话框的形式来通知用户。RFCOMM连接请求会在用户选择之前阻塞。如下图:

7.服务端的连接:

当你想要连接两台设备时,一个必须作为服务端(通过持有一个打开的BluetoothServerSocket),目的是监听外来连接请求,当监听到以后提供一个连接上的BluetoothSocket给客户端,当客户端从BluetoothServerSocket得到BluetoothSocket以后就可以销毁BluetoothServerSocket,除非你还想监听更多的连接请求。

建立服务套接字和监听连接的基本步骤:

首先通过调用listenUsingRfcommWithServiceRecord(String, UUID)方法来获取BluetoothServerSocket对象,参数String代表了该服务的名称,UUID代表了和客户端连接的一个标识(128位格式的字符串ID,相当于PIN码),UUID必须双方匹配才可以建立连接。其次调用accept()方法来监听可能到来的连接请求,当监听到以后,返回一个连接上的蓝牙套接字BluetoothSocket。最后,在监听到一个连接以后,需要调用close()方法来关闭监听程序。(一般蓝牙设备之间是点对点的传输)

注意:accept()方法不应该放在主Acitvity里面,因为它是一种阻塞调用(在没有监听到连接请求之前程序就一直停在那里)。解决方法是新建一个线程来管理。例如: private cla AcceptThread extends Thread { private final BluetoothServerSocket mmServerSocket; public AcceptThread() { // Use a temporary object that is later aigned to mmServerSocket, // because mmServerSocket is final BluetoothServerSocket tmp = null; try { // MY_UUID is the app\'s UUID string, also used by theclient code tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); } catch (IOException e) { } mmServerSocket = tmp; } public void run() { BluetoothSocket socket = null; // Keep listening until exception occurs or a socket is returned while (true) { try { socket = mmServerSocket.accept(); } catch (IOException e) { break; } // If a connection was accepted if (socket != null) { // Do work to manage the connection (in a separate thread) manageConnectedSocket(socket); mmServerSocket.close(); break; } } } /** Will cancel the listening socket, and cause the thread to finish */ public void cancel() { try { mmServerSocket.close(); } catch (IOException e) { } } }

8.客户端的连接:

为了初始化一个与远端设备的连接,需要先获取代表该设备的一个BluetoothDevice对象。通过BluetoothDevice对象来获取BluetoothSocket并初始化连接,具体步骤:

使用BluetoothDevice对象里的方法createRfcommSocketToServiceRecord(UUID)来获取BluetoothSocket。UUID就是匹配码。然后,调用connect()方法来。如果远端设备接收了该连接,他们将在通信过程中共享RFFCOMM信道,并且connect()方法返回。例如: private cla ConnectThread extends Thread { private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) { // Use a temporary object that is later aigned to mmSocket, // because mmSocket is final BluetoothSocket tmp = null; mmDevice = device; // Get a BluetoothSocket to connect with the given BluetoothDevice try { // MY_UUID is the app\'s UUID string, also used by the server code tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } mmSocket = tmp; }

public void run() { // Cancel discovery because it will slow down the connection mAdapter.cancelDiscovery(); try { // Connect the device through the socket.This will block // until it succeeds or throws an exception mmSocket.connect(); } catch (IOException connectException) { // Unable to connect; close the socket and get out try { mmSocket.close(); } catch (IOException closeException) { } return; } // Do work to manage the connection (in a separate thread) manageConnectedSocket(mmSocket); }

注意:conncet()方法也是阻塞调用,一般建立一个独立的线程中来调用该方法。在设备discover过程中不应该发起连接connect(),这样会明显减慢速度以至于连接失败。且数据传输完成只有调用close()方法来关闭连接,这样可以节省系统内部资源。

9.管理连接(主要涉及数据的传输):

当设备连接上以后,每个设备都拥有各自的BluetoothSocket。现在你就可以实现设备之间数据的共享了。

1>首先通过调用getInputStream()和getOutputStream()方法来获取输入输出流。然后通过调用read(byte[]) 和write(byte[]).方法来读取或者写数据。

2>实现细节:以为读取和写操作都是阻塞调用,需要建立一个专用现成来管理。 3>

private cla ConnectedThread extends Thread { private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) { mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; // Get the input and output streams, using temp objects because // member streams are final try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { } mmInStream = tmpIn; mmOutStream = tmpOut; } public void run() { byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read() // Keep listening to the InputStream until an exception occurs while (true) { try { // Read from the InputStream bytes = mmInStream.read(buffer); // Send the obtained bytes to the UI Activity mHandler.obtainMeage(MESSAGE_READ, bytes, -1, buffer).sendToTarget(); } catch (IOException e) { break; } } } /* Call this from the main Activity to send data to the remote device */ public void write(byte[] bytes) { try { mmOutStream.write(bytes); } catch (IOException e) { } } /* Call this from the main Activity to shutdown the connection */ public void cancel() { try { mmSocket.close(); } catch (IOException e) { } } }

推荐第7篇:Android应用程序开发个人总结

《Android应用开发》个人总结报告

一、项目简介:

送祝福App是一款逢年过节为方便发送祝福信息的软件,并且介绍各种节日的相关情况。包含节日祝福短信,支持直接发送短信给好友,也可定时发送给好友,编写模版。为生活提供了便利。

二、个人在项目中承担的任务:

我是任务是整合成员负责的模块,把各个模块整合到一起,然后把主界面的效果做出来,主界面参考的是微信的界面

三、学习本门课程收获、体会及建议:

在本门课程中,我初步认识了安卓应用开发所需基本知识,比如安装体系结构,常用的控件以及API的使用方法,知道了安卓体系存储数据的方式。这一学期,安卓相关的知识自己掌握的不多,不过也透过安卓课程看到移动端应用的火热。这一个学期里,老师讲得比较细,自己单独下来练一个知识点了,也可以,不过当几个知识点的内容整合到一起,自己就凌乱了,自己的思路就不清晰。在期末项目中,我是任务是整合成员负责的模块,把各个模块整合到一起,然后把主界面的效果做出来,主界面参考的是微信的界面,由于时间和能力的限制,只完成了部分功能,功能没有完全实现。

推荐第8篇:android开发高薪就业培训

android开发高薪就业培训

每年从大学里走出来的应届毕业生足有600万之多,加上往届毕业学生的求职竞争,他们的求职压力非同一般。而且国内经济增速放缓,不少公司正在处于休眠期,工作岗位屈指可数,而且单位选拔人才亦是千挑万选。android开发培训机构成为企业选择人才的重点基地之一。

千锋android开发培训作为移动互联网培训行业的品牌机构之一,提倡学员多思考,多讨论,多练习。培养了一批又一批学员从这里走进来,高薪走出去。千锋android开发培训的课堂,是严谨而轻松的学习体验。

学习的最终目的是为了就业,而收获到知识的同时,面对现当代就业压力巨大背景下的大学生们来说,选择一个优秀的平台显得格外的重要。老师讲授的东西只能加速理解,却不能替代思考,成就仍需靠自己来开创。不仅能学到高端的技术,又要重视提升与人际交往的能力,这也是教育机构体系建立的核心之一。

有人说,表现自己能力的方式是自学。但自学就能学出气氛么?与android开发培训行业的大神们切磋技术,机不可失。

作为千锋android开发培训对象,学员不仅是幸运的更是幸福的,短短四个月学习android开发的时间里,有幸聆听到了各位教师深入浅出、通俗易懂、旁征博引的android培训课程,让学员受益匪浅。

在千锋学习android开发培训的日子里,学员们彼此就像一个大家庭一样,经常和班上的同学一起讨论,一起说笑,一起玩耍。尽管每天学习的时间都很长,但在轻松的环境下,一点也不觉得辛苦,反而乐趣很多。

“千锋的android开发培训老师开发经验丰富,每天授课的同时,也会给我们讲一些开发时应该注意的细节和更深层次的一些内容。让我们受益匪浅,特别是最后一个月项目阶段,这个项目相对来说难度较大,经常会碰到难题,老师很耐心的跟我讲解问题该怎么去解决,最终顺利完成。”黄同学讲述着以往的学习经验高兴满怀。

作为刚毕业的学生来说,对于在千锋android开发培训四个月的学习中受到的严格的管理和要求,偶尔也会觉得抵触,但在经过四个月的磨砺后,那一刻,都会为此而荣耀。为自己曾经流过的汗水,曾辛苦拼搏的日日夜夜,而倍感值得。

2014年的就业压力会异常繁重,对于没有一技之长的大学毕业生,他们的薪酬水平,仅仅能维系自己的生存,“大学生”曾经的天之骄子,现在的弱势群体,这是教育模式与社会需求脱节造成的现状,而“千锋android开发培训”将构建一座“学院教育”与“社会需求”的宽广桥梁,将真正的天之骄子输送给更多优秀的企业以及机构,实现大学生们的自我人生价值。

“千锋教育”如今已是移动互联网研发人才一体化服务的领导品牌。每年有数十万名学员受益于千锋教育组织的技术研讨会、技术培训课、网络公开课及免费教学视频。“千锋学员”遍及全国各地,作为千锋的学员,都可以参与千锋所组织的所有活动,其中包括:“千锋校友联盟会”、“千锋校企双选会”,而此次活动就是由千锋校友联盟会发起的。千锋android开发培训不仅帮助学员解决就业问题,还帮助学员解决婚恋问题,让学员得到了高薪就业的学习体验。

推荐第9篇:Android开发工程师学习路线

Android开发工程师学习路线:手机产品开发要从基础开发知识做起

Android开发工程师学习路线图:想要做好手机产品开发要先从基础开发知识做起,要学好基础语言开发,即java语言开发,然后逐步提升自身的产品路线,将制作产品的每一步都进行完整的规划,并且将每一步要实现的功能做好设计。掌握基础开发知识,能够很好地掌握java语言的内涵,然后通过这一语言来实现程序框架中每一步的功能,并且将程序框架中的每一步都进行完善的规划,避免出现这样或那样的问题,在设计程序过程中也要掌握各种各样的算法。

千锋教育是Android培训行业领导者,千锋教育的Android开发基础班是从java开始指导学员学起,掌握了java语言,然后进行整体的产品规划。通过程序来实现产品设计中的每一步作用。很多Android开发人才都在后续工作上引入UI设计思想,把UI理念融入到产品设计中去,并且提升自身的学习模式,通过程序整体实现产品的性能。决定一个好的产品,程序员的学习质量非常重要,只有提升学习质量,把在开发过程中遇到的问题进行解决才是最根本的。千锋教育Android培训课程模块化,指导学员学习完阶段性课程,指导学员完成自己的产品,让学员在开发过程中遇到的问题进行解决。

Android开发学习过程中要掌握好基础知识,特别是java语言的应用,然后逐步提升学员在学习过程中遇到的一些细致化的问题,把一些难点进行解决,在开发过程中把容易出现的一些难点进行合理化控制,避免在程序生成产品后出现问题,从而导致崩溃,这是非常重要的一点。

推荐第10篇:Android开发基本知识总结Android课件

Android开发基础教程

2015-4-13周一2CJ02 目录

1.什么是Android? 2.Android应用开发环境 3.Gradle 4.模拟器Emulator 5.开发一个安卓应用程序的步骤 6.关于多个模拟器的问题 7.安卓工程文件的结构 8.android界面文件---xml文件 9.android程序文件---java文件 10.界面布局方式 11.几个常用组件 12.Roast组件 13.对话框AlertDialog 14.几条重要的语句 15.监听器Listener 16.识别响应事件的组件 17.界面切换

18.界面之间的数据传递 19.Activity生命周期 20.多媒体播放

21.日志文件在程序调试中的使用 22.使用XML文件保存数据

23.使用TXT文件保存数据 24.使用数据库保存数据 25.时间组件 26.线程Thread 27.视频播放VideoView 28.MediaPlayer,SurfaceView和SurfaceHolder播放视频 29.录制音频MediaRecorder 30.菜单组件

1.什么是Android? 移动设备(常常指手机mobile)的操作系统,由google公司出品,是免费的, 最早是基于Linux平台的;目前已经推出的Android3.0是平板电脑上的操作系统。

其它的手机操作系统有:iPhone系统等。

手机厂商:三星(Samsung,宏达电(HTC),摩托罗拉(Motorola),华硕,索尼,Garmin等都支持iPhone系统。

Android系统功能:自定义用户界面,支持蓝牙,多点触摸,具有导航功能和语音识别功能,结合了google地图。

Android软件开发工具SDK

4.0。

Android系统特点:虚拟键盘,以WebKit为核心的WebView组件,可以使用HTML, javascript等。

2.Android应用开发环境 Eclipse+ADT+Android SDK。 ADT---Android开发工具插件(Android Plugs for Eclipse).开发环境安装注意事项:关闭防毒软件,按顺序安装,保持网络畅通,比较耗时。特别说明,安装和运行需要高配置机器和高速网络,比较费时。

(1)安装Java

JDK。甲骨文

网站: http://www.daodoc.com ”); Intent in = new Intent(Intent.ACTIN_VIEW, uri); startActivity(in); (2)调用系统拨号界面

Uri uri = Uri.parse(“tel:13087561830 ”); Intent in = new Intent(Intent.ACTIN_DIAL, uri); startActivity(in); (3)调用系统拨号功能

Uri uri = Uri.parse(“tel:13087561830 ”); Intent in = new Intent(Intent.ACTIN_CALL, uri); startActivity(in); 注意:需要在AndroidManifest.xml文件中进行设置,才可以自动拨号: 18.界面之间的数据传递 1.方法1:调用无返回参数 在第一个界面中: Bundle bundle

= new Bundle(); bndle.pushString(“name”, “David”); bndle.pushInt(“age”, 22); //pushChar, putShort,put Boolean, pushChar等等

Uri uri = Uri.parse(“http://www.daodoc.com ”); Intent in = new Intent(Intent.ACTIN_VIEW, uri); in.putExtras(bundle); startActivity(in); 在第二个界面中: Intent in = this.get Intent(); Bundle bundle

= in.getExtras(); String studentName = bundle.getInt(); //getDouble, 2.方法2:调用有返回参数 例1,在第一个界面中: private static final int ACTIVITY_EDIT = 1; Bundle bundle = new Bundle(); bundle.pushString(“name”, “David”); Intent in = new Intent();

getShort, getIntArray等 in.putExtras(bundle); in.setCla(FullscreenActivity.this, SecondActivity.cla); startActivityForResult (in, ACTIVITY_EDIT); 注意:startActivityForResult后所有语句无效,不执行;在第一个界面中,第二个界面可以在不同位置被多次调用;在第一个界面中,在其它位置可以调用其它界面。

在第一个界面中,重写onActivityResult,接收所有被调用界面返回的参数(如果有):@Override protected void onActivityResult(int

requestCode,int resultCode,Intent

data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode== ACTIVITY_EDIT)

//此参数可以区分不同的调用

{

Bundle bundle = data.getExtras(); if (resultCode == RESULT_OK)

//此参数可以判断有无返回参数

{

Bundle bundle = data.getExtras(); ……

} if

(resultCode == RESULT_CANCELED)

{ } }

…… } ……

问题

:如何判断被调用界面是否传递返回参数?如何区分返回参数是由不同的被调用界面传递的?android的这种解决方法并不是完美的。 例2,在第二个界面中:

读取第一个界面传递的参数,省略;下面是向调用程序传递返回参数: Bundle bundle

= new Bundle(); bndle.pushString(“name”, “贺昌峰373780592”); Intent

setResult(RESULT_CANCELED); //传递参数返回

// 或setResult(RESULT_OK, in); //不传递参数返回 finish(); 注意:这时,第二个界面返回到第一个界面,可以不传递参数直接返回(RESULT_CANCELED),

in = new Intent();

in.putExtras(bundle); 也可以传递参数返回(RESULT_OK)。 19.Activity生命周期

onCreate

--- onStart

--- onResume

--- onPause --- onStop

--- onDestroy 也就是说,有: protected void oncreate(…){ ….} protected void onStart (…){ ….} protected void onResume (…){ ….

} protected void onPause (…){

….} protected void onStop (…){ ….

} protected

void onDestroy (…){ ….

} 20.多媒体播放MediaPlayer public MediaPlayer player = new MediaPlayer (); //生成语句可省略 try{ player.reset();

//重新播放音乐

player.setDataSource(“/sdcard/music/music_file_name.mp3”);

// player = MediaPlayer.create(getApplicationContext(), R.raw.music);

// 打开音乐文件

//music为音乐资源文件

player.prepare(); player.start();

// player.isPlaying()

//准备播放 //播放音乐

//判断是否正在播放

//音乐播放完成触发事件

player.setOnCompletionListener(new OnCompletionListener){ public void onCompletion(){ //音乐播放完成后,处理代码 } }

player.pause(); player.start(); player.stop();

} catch(IllegalStateException e){ ……} catch(IOException e){ ……}

//播放暂停 //继续播放音乐 //停止播放音乐 player.release();

//释放存储空间

//注意:可以播放存储卡上任意一个音乐文件;也可以播放资源列表中的音乐文件 21.日志文件在程序调试中的使用

import android.util.Log; 对应的方法有:debug,verbose,info,warn,error。注意,使用简写。 问题:如何查看系统日志文件?

Log.d(“这里是分类标签”, “这里是输出信息”); 22.使用XML文件保存数据

对XML文件进行操作,形式为(key,value)。 SharedPreferences

sp = get SharedPreferences(文件名,权限);

权限:MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 例:

//1打开XML文件 SharedPreferences

//2更改数据

Editor editor = sp.eidt();

//更改数据

sp = get SharedPreferences(“myconfig”, MODE_PRIVATE);

editor.putString(“name”, “贺昌峰373780592”); editor.putInt(“age”, 48); editor.putFloat(“salary”, 2048.5); //putLong,putBoolean等;

editor.commit();

//保存数据

//3读取数据

String myname = sp.getString(“name”, “”);

//4删除数据

editor.remove(“name”); //删除数据 editor.commit();

editor.clear(); //删除全部数据 editor.commit();

//5简写形式如下: Editor editor = sp.eidt()

//更改数据

//读取数据

.putString(“name”, .commit();

“贺昌峰”) 23.使用TXT文件保存数据 FileOutPutStream

fout = openFileOutput(文件名, 文件权限); 文件权限: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE

1.在文件中写入数据

try { //打开TXT文件 FileOutPutStream

BufferedOutputStream

String

//向文件中写入数据

bufferoutput.write(s.getBytes()); s = “大家跟我学习android”;

bufferoutput = new BufferedOutputStream(fout); fout = openFileOutput(“myconfig.txt”, MODE_PRIVATE);

//关闭文件 bufferoutput.close(); fout.close(); } Catch(Exception e) {

2.从文件中读取数据

try { FileInputStream

BufferedInputStream

byte[] bufferbytes = new byte[20]; int flag = bufferoutput.read(bufferbytes); if (flag==-1) { //文件读取到文件末尾,否则可以继续读出

}

//仅读取长度为20个字节的数据

bufferoutput = new BufferedInputStream(fout);

fout = openFileInput(“myconfig.txt”);

//打开文件

e.printStackTrace(); } bufferoutput.close(); fout.close(); } Catch(Exception e) {

24.使用数据库保存数据 1.数据库相关类

//关闭缓冲区 //关闭文件

e.printStackTrace(); } import android.content.ContentValues; import android.content.Context; import android.database.Coursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase;

2.SQLiteDataBase类

注意:数据库操作时,要求捕获异常,此处省略。

SQLiteDataBase db = openOrCreateDatabase(“databasename.db”, MODE_PRIVATE); //说明:数据库权限同文件权限

// Context就是this指针 db.execSQL( sql_exp ): 执行SQL语句

Cursor cs = db.rawQuery(select_exp, null): 返回数据集。 Cursor cs1 = db.query(arg0, ……): 使用较繁琐,可用rawQuery替换。

db.insert(arg0, ……): 使用较繁琐,可用rawQuery替换。 db.delete(arg0, ……): 使用较繁琐,可用rawQuery替换。 db.update(arg0, ……):

使用较繁琐,可用rawQuery替换

db.close(): 一般写在onDestroy事件中。 3.Cursor类 方法有:

move, moveToPosition, moveToFirst, moveToLast,

moveToNext, getCount(), getInt(),

getString(),

isNull(), isFirst()等等。

4.ContentValues类

一般用在SQLiteDataBase.insert中, 此处省略。

ContentValues content

= new ContentValues();

content.put(“name”, “贺昌峰”);

moveToPrevious, content.put(“age”, 48); 5.SimpleCursorAdapter类

SimpleCursorAdapter是界面组件如ListView和Cursor的桥梁。 例, 在ListView组件listview1中,显示数据集(有绑定功能吗?):

Cursor cs = db.rawQuery(“select SimpleCursorAdapter

adapter

* from table”, null);

= new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, new String[]{“id”, “name”}, new int[]{ android.R.id.text1, android.R.id.text2}); // 注意:第2个参数的作用

listview1.setAdapter(cs);

//在ListView组件显示数据集

25.时间组件

1.常用组件AnalogClock,

DigitClock 用法比较简单,无需过多设置,仅仅显示当前时间:机械式,数字式

2.计时组件:Chronometer 常用方法:start开始计时, stop停止计时, setBase设置时间 setFormat(“秒表:%s”):设置组件时间显示格式。

附:与时间格式有关的函数 SimpleDateFormat String

sformat = new SimpleDateFormats(“hh:mm:”);

//得得当前时间 s = sformat.format(new Date() );

例,Chronometer对象是chroTime: chroTime.setOnChronometerTickListeter(chrolisteten);

private Chronometer.onChronometerTickListeter Chronometer.onChronometerTickListeter(){ @Override public

void OnChronometerTickListeter(Chronometer chronomoter){ //每秒执行一次该方法 } }

3.计时组件Timer和TimerTask

chrolisteten = new 常用函数:schedule(TimerTask对象, Timer对象延迟时间, TimerTask对象间隔时间);

TimerTask对象用法: private TimerTask { public void run(){ //按设定间隔调用执行 handle.sendMeage(msg); //特别注意:此处不能对界面进行更新,因为影响计时精度,所有需要使用Handle配合。见下。 } }

4.Handle和Meage的配合使用 Handle handle { public void handleMeage (){ super.handleMeage (); //进行其它处理 }

= new Handle ()

timetask = new TimerTask() } Meage

msg.what = “******”; handle.sendMeage(msg);

26.线程Thread

1.Thread的定义

public cla ClockThread extends Thread{ @Override public void run(){ //进行其它处理

//注意:不会自动重复执行多次的 } } 2.Thread的启动、延时启动、停止 使用Handle对线程进行控制: msg = new Meage(); Handle handle = new Handle();

ClockThread clock = new ClockThread();

handle.post(clock);

//启动线程 5000);

//延时5000ms启动线程 //停止线程 handle.postDelayed(clock, handle.removeCallbacks(clock);

问题:使用Handle有什么优点? 27.视频播放VideoView 支持的文件格式:H.264的mp4, wmv, 3gp等。 1.视频播放

private VideoView

videoview.setVideoPath(“/sdcard/robot.mp4”); //增加控制面板

videoview.setMediaController(new MediaController(getApplicationContext()));

videoview

= new VideoView(); videoview.start(); //开始播放

2.视频准备播放事件

videoview.setOnPreparedListener(videoPreparedListener); videoview.setOnCompletionListener(videoCompletionListener);

private MediaPlayer.onPreparedListener videoPreparedListener = new MediaPlayer.onPreparedListener (){ @Override public

void onPrepared (MediaPlayer

mp){ //视频准备播放 } }

3.视频播放完成事件

private MediaPlayer.onCompletionListener videoCompletionListener = MediaPlayer.onCompletionListener (){ @Override public

void onCompletion (MediaPlayer

mp){

new //视频播放完成 } }

28.MediaPlayer,SurfaceView和SurfaceHolder播放视频

MediaPlayer也可以播放视频,需要SurfaceView和SurfaceHolder配合,其中SurfaceView为可视化组件可以播放视频,SurfaceHolder为桥梁。

private SurfaceView surfview = new SurfaceView(); //此组件可视化设计,无需这里声明 private MediaPlayer

surfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaplayer.setDisplay(surfholder);

mediaplayer.setDataSource(“/sdcard/vedio.mp4”); mediaplayer.reset();

//打开视频文件

mediaplayer = new MediaPlayer();

= surfview.getHolder(); private SurfaceHolder surfholder

//重新播放视频 mediaplayer.prepare(); mediaplayer.start(); mediaplayer.stop(); mediaplayer.release();

//准备播放视频 //播放视频

29.录制音频MediaRecorder MediaRecorder

mediaRecorder.SetAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.SetAudioEncode(MediaRecorder.AudioEncode.DEFAULT ); mediaRecorder.SetOutputFormat(MediaRecorder.OutputFormat.DEFAULT ); mediaRecorder.SetOutputFile(“/sdcard/recorder.amr”); mediaRecorder.prepare(); mediaRecorder.start();

注意:要有写入SD卡的权限,在AndroidManifest.xml文件中:

//准备录音 //开始录音

mediaRecorder = new MediaRecorder(); :

1.附1:ImageView.setAlpha(50)的含义?设置透明色 2.附2:遍历目录下所有文件: private File pathfile; pathfile = Environment.getExternalStorageDirectory();

//疑问:pathfile + ”/myfilename.txt” 这个用法正确吗? for (File file: pathfile.listFiles()){ if { (file.getName().toLowerCase().endsWith(“.amr”)) ……

// File.getAbsolutePath(), File.getName ()的区别 } } 30.菜单组件 //添加系统菜单 protected protected static final int MENU_ABOUT

= Menu.FIRST; static final int MENU_QUIT = Menu.FIRST + 1;

//得到SD卡路经 protected

@Override static final int MENU_EDIT = Menu.FIRST + 2; public boolean onCreateOptionsMenu(Menu menu){ menu.add(0,MENU_ABOUT,0,\"关于本软件...\") .setShortcut(\'0\',\'A\');

menu.add(0,MENU_QUIT,1,\"结束\") .setShortcut(\'1\',\'E\');

menu.add(0,MENU_EDIT,2,\"编辑\") .setShortcut(\'2\',\'D\');

menu.add(0,MENU_FILE,3,\"文件\") .setShortcut(\'3\',\'F\');

return super.onCreateOptionsMenu(menu); } //添加菜单响应事件 @Override public boolean onOptionsItemSelected(MenuItem switch (item.getItemId()){ case MENU_ABOUT: // 响应处理 break; case MENU_QUIT: // 响应处理 break; }

return super.onOptionsItemSelected(item); }

//添加快捷菜单 protected static final int MENU_BACKCOLOR protected static final int MENU_SMALLSIZE =

item){

= Menu.FIRST;

Menu.FIRST + 1; //定义快捷菜单组件 private LinearLayout private TextView

layout;

txtview1,txtview2; 在onCreate中, 增加以下语句: layout = (LinearLayout)findViewById(R.id.layout); txtview1 = (TextView)findViewById(R.id.txtview1); txtview2 = (TextView)findViewById(R.id.txtview2); registerForContextMenu(txtview1); registerForContextMenu(txtview2);

在java文件类中, 增加以下语句: @Override public boolean onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ //注意:父类函数先调用,或最后调用? super.onCreateOptionsMenu(menu, v, menuInfo);

if (v == txtview1) menu.add(0, MENU_BACKCOLOR,0,\"设置背景颜色\"); if (v == txtview2) menu.add(0, MENU_SMALLSIZE,1,\"较小字体\");

}

//添加菜单响应事件 @Override public boolean onContextItemSelected(MenuItem switch (item.getItemId()){ case MENU_BACKCOLOR: // 响应处理

layout.setBackgroundColor(Color.BLUE); break; case MENU_SMALLSIZE: // 响应处理

txtview2.setTextSize(12); break; }

return super.onContextItemSelected(item); }

item){

第11篇:《Android应用开发》个人总结报告

《Android应用开发》个人总结报告

刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发范例大全中的例子以及Android提供的APIDEMOS进行学习,尽管例子之间的连接比较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想,因为Android在现在也是全新的技术和框架,在其中我也学到了如何用单例模式、工厂模式等常用的设计模式进行学习,通过API进行开发客户端,对Request发送,Response处理中通过比较方便的JSON对象传输,以及对XML、JSON、图片、业务等下载处理,对API接口调用等问题处理。

首先在界面上,我们同样可以通过不同布局进行设计非常酷的界面,这些界面可以通过include进行引入,和jsp、html也有相通的地方,同样在android上可以用到自定义的样式这和c也有比较相通的地方,我们可以通过一些公用的方法写个BaseActivity这个基类,通过继承方式比较不错的实现了Activity的界面,因为这样你可以Header(头部)和Footer(尾部)进行处理一些触发事件或者特效等。布局模式以相对模式为主,线线布局模式可以在比较简单的include进行完成,最重要的一点就是:我们可以自己通过重写方法或者通过实现View或者Layout等类进行扩充项目需

要的布局(或者控件) ,在学习界面中,我发现Android为我们提供了很好的类似反射机制,通过Layout文件夹下的配置文件,可以快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。对比较特殊的界面也可以通过处理嵌入到指定的界面,同样你可以通过java代码直接创建View进行添加,不过这种方式比较复杂。对一些点击、选中、按键等处理的事件,界面之间的 跳转Intent管理,通过Bundle对数据在界面之间进行传输。

Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。 从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。

一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。

一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有

ListView 的

Layout,还有

simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。

除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使

第12篇:Android开发分享讲稿(修改)

讲清楚,do better Android开发入门分享

今天要给大家分享的是Android开发入门,小青青_Lo是我的微博昵称,如果觉得我讲得好,求互粉(*^__^*) 嘻嘻~~

讲解大纲

这个是今天讲解的大纲,首先通过著名Hello world程序对Android开发有一个感性的认识,

之后上升到理性认识,了解android开发的重要组成部分和基本开发流程。Android开发主要包括App组件,App资源和App的配置文件。App组件主要负责和用户交互,处理用户请求;而App Res主要负责用户界面的视图;App Manifest文件主要用来声明App运行所需环境,比如App包含哪些功能模块,API最低最高版本要求,比如Android操作系统版本要求运行设备的性能要求,比如屏幕分辨率,内存空间大小等,用户是否有权限访问一些系统应用程序和系统数据,比如通讯录, GPS位置信息,本地通知服务等。

在讲解Android开发的重要组成部分的过程中会涉及一些简单的实例现场演示来讲述Android开发的基本流程。

欢迎提问

因为我本身是一个Android开发的新手,在加上本身写代码写得少,所以难免会有一些错误和讲得不清楚得地方,欢迎大家提出疑问,提问有奖。如果我答不出来,记下来分享后查资料给大家回答。

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better

为什么要学习Android开发?(此段可以精简下)

Android操作系统目前占移动操作系统78%的市场份额,这个充分说明了android开发市场大需求广。现在大家都知道移动互联网是大势所趋,每天坐公交地铁,一眼望去大家都在忙于刷手机ipad就已经充分说明这点,随着移动互联网的兴起,App开发自然是大势所趋。Android操作系统之所以发展如此迅速,和其开源有着密不可分的关系,开源意味着便于扩展和学习,以及使用。

之后我们简单介绍下Android系统架构,一共分为四层,最下层的是linux内核,负责内存管理,进程调度,网络协议以及各种设备驱动等,再上面是各种系统运行库,其主要是应用框架层和linux内核的重要纽带,而我们下载的android SDK处于应用框架层,主要负责给android应用开发提供各种基础服务,我们平时使用的微博,微信等app应用程序就处于应用层。 简要介绍了android系统,我们现在开始anroid开发之旅。 部署Android开发环境

Android开发第一步就是部署android开发环境,部署android开发环境有两种方式:方法一是JDK+android studio, 方法二是JDK+SDK+Eclipse。我们现在比较下这两种的特性,首先从部署便捷性来看AndroidStudio要比安装SDK步骤少,更方便简单。之前小超分享框架的时候说应用性和性能一般成反比,Android Studio的IDE好用,这同样意味着其性能比SDK的要低,所以其编译运行速度Eclipse显然比Android Studio快,内存消耗低。运行Android Studio一般将我可怜本本拖垮。如果从开发效率来看,方法一显然要高于方法先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 二,从代码架构来看,AS的Java/resoure/Manifest三个文件夹就一一映射了Android开发的三个重要组成部分,而Eclipse的代码架构相比之下稍显混乱。而且Android Studio的UI可视化也比Eclipse的更为强大好用。对于运行机器要求,显然Android Studio比JDK的要求高。

综上所述, AS作为google的官方开发工具,再者从大家最关心的开发效率来看,AS是Android开发的IDE最佳之选

AS是基于IDEA的,好好看看AS好在哪!

http://java.dzone.com/articles/why-idea-better-eclipse

首先创建工程 (1) 建立一个工程

FileNewAndroid Application Project

运行程序,选中app,右键点击菜单选择run asAndroid Application.注意此时需要将Android手机通过usb接口连接到电脑上,而且选择允许调试,即可在手机上安装运行的app,从而看到运行效果。

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better

(2) 分析代码架构(src/res/Manifest File)

src: java code, 主要负责实现App的组件(Activity,Broadcast,ContentProvider,Service etc)和数据存储(文件存储,db存储,shared Preference),完成用户界面内的相关交互。

res: layout,values,drawable etc, 主要负责UI布局,都是xml格式的文件。 Manifest File:主要是配置App的运行环境。Api的版本需求,App的访问权限,App所包含的组件,设备特征的相关权限等 (3) 建立并运行一个activity 先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better PS:首先注意到此处有一个黄色感叹号,说明此程序有警告,如果是一把红叉叉,就是程序包含错误,需要修复。此处有警告,是因为使用了低版本的类ActionBarActivity,所以类名上面有横线,在此处我们修改为Activity类,然后按快捷键ctrl+shift+O,自动import该类的命名空间。此时发现import android.app.Activity; 并且黄色的感叹号消失了。

Android开发重要组成部分

接下来我们进一步了解Android开发,Android开发的重要组成部分。 Android组件主要包括活动,广播,服务和内容提供器。这四大组件是组成App的基础功能模块,而intent和intent-filters是用来衔接各个功能模块组件,负责组件之间的交互和通信。

如果是组件是负责逻辑控制,那么App Res主要负责用户界面视图,在此会介绍构成视图的资源类型,以及各个资源的组成方式;之后还会介绍如何在代码中访问资源。由于运行app的设备分辨率不同,语言不同,操作系统版本不同等原因,需要考虑到资源如何对各种不同设备的硬软件兼容。

最后我们简单介绍下配置文件的作用。Manifest文件主要是用来声明App运行环境要求,支持什么版本的api, app包含哪些组件,需要哪些用户权限等。 Activity的定义

首先我们来看四大组件中最常见的Activity, 在SDK的官方文档是这样定义Activity的,其主要是提供一个可以让用户进行交互完成某些请求的用户界面。比如说用户在拨打电话,拍照,发送邮件,看地图的时候都需要一个用户界面,通过这个界面用户可以和app进行对话,发出请求,app响应请求。同样在刷先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 微博的时候我们也可以处处看到Activity,微博feed流,点击消息进入消息箱。简而言之,Acivity是承载某个功能的UI和交互的一个容器,在app中看到的是一个用户交互界面。 Activity状态和生命周期

Activity一共有三种状态,当Activity处于前端的时候,也就是获取用户焦点的时候,其状态为Resumed,此时处于前端生命周期,而当其失去用户焦点,但是还是部分可见的时候,其状态为paused,此时不属于前端生命周期,而属于可见生命周期范围内,而当其失去用户焦点,又不可见的时候,此时就是stoped。从创建到stop整个过程为完整生命周期。

我们可以看一个例子。

主界面获取用户焦点

主界面不可见失去

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better

对于组件的用法主要分为三步: (1) 实现组件类

(2) 在Manifest或者代码中注册组件 (3) 在活动中启动或者触发组件

如何使用Activity(见demo)

(1) 创建UI—second.xml (2) 创建SecondActivity (3) 启动一个activity

前面我讲到要从主界面而跳转到第二个界面,也就是从第一个活动跳转到第二个活动,这个时候需要intent来衔接各个组件,完成组件之间的交互。

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 首先我们来看下官方sdk上对intent的定义,intent是指向其他app发出动作请求,四大组件中的活动,服务和广播都是由intent来启动(此处没有讲清楚呀!!)也因此intent有广泛的应用,比如

– 从微博feed流跳转到消息箱 – 启动本地通知服务,闹钟备忘录服务 – 发微博晒照片跳转照相机程序

– 密码变更的时候,发送强制下线的广播…

Intent的类型

Intent包含两种类型,显式intent和隐式intent,显式intent是指通过组件类名来启动组件。然后隐式的intent是通过声明组件要执行的动作,android系统根据要执行的动作找到相应的组件启动之。

什么也不多说,我们看看代码。从代码中也可以看出显示intent和隐式intent的区别。一个是从主界面跳转到第二个页面,一个是先在Manifest声明跳转的动作,系统找到符合条件的活动进行启动。 隐式intent活动启动的原理

我们通过一个图来看看隐式intent启动活动的原理,如图所示:

[1] Activity A 通过一个Action的描述创建Intent,并将其传给startActivity.[2] 安卓系统搜索所有activity的intent filters,看是否这个intent中的action [3] 如果ActivityB 符合,则将启动Activity B

运行一个intent 先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 如果要build一个intent,要么采用显式的intent通过组件类名进行启动。 要么描述组件要执行的动作或者种类信息,系统找到满足条件的组件进行相关的启动,可能执行某些动作的时候还需要携带一些数据。

Intent的用法

Intent可以用来启动一个活动,也可以用于启动一个服务,或者将其余服务进行相关的绑定,或者发送广播,或者在这个过程中传递或者返回数据。 具体会在后续进行相关的讲述。

Pendingintent的定义和应用

PendingIntent是指在intent对象外包了一层。Pendingintent最初的目的是用于授权外部程序可以使用内部的intent,就好像这个intent是内部调用,然后在内部进程内执行的。

其主要应用场景有:

一个是用于声明本地通知服务时所需的intent代码 另一个是用于声明定时任务触发的intent 最后是声明与控件交互的intent

Broadcast的定义和应用

广播接收器是指可以用来接收系统范围内的广播通知的组件。 广播的应用有:

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 一些是来自系统的广播,比如说提示app电量过低,提示网络中断,不能再正常刷微信微博,开机时通知某些app自动启动。

有一些是应用程序广播或者本地广播,所谓本地广播是指程序内部的广播。比如当通知所有的活动强制下线等。

Broadcast的运行流程

Broadcast的运行流程包括发送广播,注册广播接收器和接收广播。发送广播主要是通过intent来进行广播的发送,注册广播接收器有两种方法,一种是在manifest中静态注册的方法,在manifest中声明接收器的类名以及相关动作。一种是在代码中动态注册的方法,在代码中创建intent-filter,并创建广播接收器对象,用这两个参数注册广播接收器;最后接收广播,就需要实现广播接收器的类,其中最重要是重载onReceive函数,里面是处理当接收到广播的时候如何处理。

ContentProvider的定义和应用

ContentProvider主要是提供访问外部数据的标准接口。

ContentProvider主要适应于当需要将一些复杂的数据或文件提供外部程序使用时,出于安全的考虑,提供contentprovider作为外部程序访问内部数据的接口。当只是在内部完成一些数据的读写,此时是不需要provider的。

ContentProvider的运行过程:

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better

1.App0 给其他app提供了一些数据。

2.App1和App2都想访问App0内部的数据,但App1因为没权限而无权访问,App2在manifest中声明了其访问权限。

3.为了App0内部数据安全,App0给外部程序提供了访问内部数据的标准接口即ContentProvider。

4.App2通过getContentResolver转化content URI中的provider authority和path,并与已知的providers匹配,从而找到所需要的provider,从而成功访问App0的内部数据。 ContentProvider的用法:

首先设计相关的数据结构——文件或者结构化数据。

之后就是设计内容的URI,实现provider的类,之后就是定义provider的属性,并且在manifest文件中注册相关的provider。

最后使用getContentResolver来找到正确的provider, 我们可以通过一个通讯录的例子来进行相关的了解。

Service的定义和应用

服务主要指在后台长期运行的程序。

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 服务的应用有本地通知服务,定时任务服务和后台应用程序等。

Service的生命周期以及服务的相关用法

服务的生命周期分为完整生命周期和活跃生命周期,完整生命周期是指从服务创建到服务销毁。如果某个服务在某个活动启动,即使是活动被销毁了,这个服务也依然存在,比如push服务,即使没有停留在app前端,push服务也是在后台运行的。

而活跃生命周期是指从服务绑定到服务解绑的整个过程。

Service的相关用法:

实现服务类,在manifest中注册服务组件,并且在活动中启动或者绑定某项服务。

你会发现所有的组件的使用,基本都是实现具体组件类,然后再manifest中注册或者在代码中注册,之后在活动中通过intent启动相关的组件。

资源Resources Res用于构建我们看到的用户界面视图,我们将从以下三个方面来讲述:资源类型,设备兼容性,以及如何在代码中使用Resource,我们对照右图,可以看出资源有布局,有字符串,有调色板等,除了资源的种类,资源还会考虑设备的兼容性,比如说根据屏幕分辨率——分为hdpi的调色版,ldpi的调色板等,根据系统语言,字符串的分为英语,中文,日语的等,而由于不同设备上安装的是不同版本的android操作系统,自然资源要适配各种不同版本的api,比如先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better values-v11,values-v14等

为了更好的用户交互,有时候我们要获取资源,比如实现点击登录按钮跳转到微博主页,我们必须获取登录按钮,针对这个按钮先点击事件。那如何获取到登录按钮呢?也就是如何获取到按钮资源呢?在Android开发中会生成一份R文件,为每一个资源都分配了一个id,我们可以根据这个id进行访问。那如何获取到这个id呢,主要是根据我们在资源xml文件中定义的id,比如R.id.btn_login,类似于html中我们用到的id,也可以是类型+资源名来获取到这个id,比如R.string.hello_world。

布局的树形结构

一个用户界面整体是一个树形结构,有一个根的layout,之后layout可以相互嵌套。在android中资源分为两类:viewGroup和view,而viewGroup继承与view,viewGroup主要指布局,而view主要指控件,如按钮,文本,列表框等 Layout 讲到布局,必须提到布局的几种类型,最常用的是线性布局,其次是相对布局,之后是绝对布局和帧布局,线性布局分为垂直和水平,默认是水平的方式。相对布局主要是相对屏幕或者某个控件,某个内嵌布局的相对位置。 Manifest的相关作用

Manifest主要是用来声明App的运行环境,比如运行设备的硬软件特征,对屏幕分辨率,内存空间大小的要求,对Android操作系统版本的要求,App包含哪些组件,需要哪些用户权限等。这些都需要在Manifest中进行相关的声明

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better

小小测试---初步理解认识UI和交互

最后是做些小小测试,检验下大家今天的收获成果,比如在Android开发最重要的就是UI和交互,通过之前的几个小实验,现在大家思考下,这些稍微复杂一点的界面UI如何实现呢?如何构造布局,选择何种控件?

可以看到左边的这个,有一个标题栏,下面是聊天界面,最下面是输入框和发送按钮,可以做一个垂直线性的布局。上面的标题栏可以做一个横向线性的布局,中间的是一个listview的列表框,下面也可以做一个横向的线性布局(手绘一下基本的一个构造)

中间是一个通讯录的页面,这个通讯录的好友页面较之我们之前要复杂的多 也可以做一个垂直的线性布局,上面是一个标题栏,下面是一个listview,标题栏做一个横向的线性布局。而listview对其每一个list又定义一个横向的线性布局,一个ImageView图像控件和一个文本控件 右边的就相对要简单。标题栏加一个图像对象

看完UI之后,我们来分析下交互,左边的是输入文本框的内容,在点击按钮的时候获取文本框的内容添加到消息对象中,listview的消息列表中添加这条发送的消息。

中间就是我们刚刚获取了通讯录的用户名和电话号码的基础上之后,我们还需要获取联系人的头像。将这些元素在自定义列表布局中进行显示。

右边是添加一个感知器对象,感知手机晃动加速度,当加速度达到一定程度,随机弹出一个餐厅的名字。

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better 这三个界面可以做三个活动,在活动中显示UI,并且在活动中完成按钮以及列表框的触发事件。最后通过intent在各个界面之间进行跳转。

最后我们分析下微博的构造来理解四大组件。

微博有哪些主要的功能模块,这些功能模块之间如何交互。

从最下面的导航栏可以看出主要有微博主页,消息箱,微博发布器,发现和我的profile五大功能模块。他们之间可以通过点击按钮实现跳转到相应的活动页面,如果再进入更加深入一级别,就通过点击返回键,返回到上一界面。

首先所有的活动都会接收系统状态参数的一些广播,比如电量,比如网络状态,而且所有的活动都会接收push SDK的push通知服务等,所有活动也会接收当密码变更强制下线的广播。比如通讯录访问手机联系人的时候会用到通讯录数据。 我们主要分析下微博feed流和消息箱,这些一般都是分为几个模块,feed流和消息箱都是相应的listview,并且对list定制布局。

后记

本次分享旨在让大家对android开发有一个初步的认识,了解android开发的重要组成部分和基本开发流程,当接到android开发的需求的时候,有一个开发的方向感和清晰的开发思路。希望大家能动一动手,一起见证奇迹app诞生时刻。

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

讲清楚,do better

先做加法讲清楚,之后做减法,言简意赅,严格控制时间

第13篇:Android操作系统应用开发报告

Android操作系统应用开发报告

项目名称: 作

者: 学

号: 完成时间:1.开发目的

本次应用开发的预期目的及相关功能介绍。

2.程序系统

对所开发程序系统的介绍,包括总体结构,程序系统中各个程序或函数的名称及其介绍,他们之间的层次关系。

3.主要功能

说明所开发程序系统具有的实际功能。

4.基本流程

用图给出所开发程序系统的实际处理流程。

5.出错原因分析

给出开发过程中出现错误的原因分析。

6.开发心得

列出本次课程开发工作中所得到的经验与教训,以及心得体会。

第14篇:Qualcomm平台android开发总结

1、高通平台android开发总结.7 1.1 搭建高通平台环境开发环境.7 1.2 搭建高通平台环境开发环境.7 1.2.1 高通android智能平台概述.7

1.2.1.1 什么是L4,REX,BREW,AMSS以及相互之间的关系.7 1.2.2 选择合适的源代码以及工具.8

1.2.2.1 获取经过高通打补丁的android 源代码.8 1.2.2.2 获取高通针对不同处理器的vendor源代码.9 1.2.2.3 获取 modem 源代码.9

1.2.2.3.1 高通 modem 源代码编译前的修正.13 1.2.3 建立 Android 开发环境.14 1.2.4 建立 modem 开发环境.15 1.2.4.1 补充.16

1.2.4.1.1 获取 licenses 16

1.2.4.1.2 Flex 简单使用指南.16 1.2.4.1.3 启动 license 服务器.18

1.2.4.1.4 license 没有办法从服务器获取的几种情况.18 1.2.4.1.5 破解 rvds 的license 19 1.2.5 在高通开发板上烧录文件系统.19

1.3 高通平台,android和 modem 编译流程分析.21 1.3.1 android代码编译流程分析.21 1.3.1.1 编译工具检测.22 1.3.1.1.1 22

1.3.1.2 appsboot.mbn 生成过程解析.22

1.3.1.3 boot.img 生成过程解析,怎样手动生成 boog.img 28 1.3.1.4 编译过程存在的问题.32

1.3.1.4.1 prelinkmap 的时候 base 0xaff00000 out of range 32 1.3.1.4.2 LOCAL_SDK_VERSION 使应用程序不能访问hide的api 32 1.3.1.4.3 armv5te-vfp 导致一些游戏运行不了.32 1.3.2 分布式编译 android 代码.33 1.3.3 modem 代码编译流程分析.33

1.3.3.1 单独编译某个模块(如:qcsbl oemsbl).34 1.3.3.2 $(TARGETDIR)/exist 规则解析.36 1.3.3.3 setup规则解析.36

1.3.3.3.1 corebsp_create_incpaths 36 1.3.3.3.2 create_incpaths 36 1.3.3.3.3 ametup 36

1.3.3.3.4 amlinkaddre 36 1.3.3.3.5 firmware 38 1.3.3.4 deps规则解析.38

1.3.3.5 corebsp_build规则解析.38 1.3.3.5.1 corebsp_build_action 38 1.3.3.5.1.1 corebsp_scons 规则.39 1.3.3.5.1.1.1 corebsp_scons_start 39 2.3.3.5.1.1.1 corebsp_scons_action 39

1.3.3.5.1.1.2.1 命令 pboot_gen_elf image_header pboot_add_hash 解析.40

1.3.3.5.1.1.2.2 env.BinBuilder 过程解析.41 1.3.3.5.1.1.2.3 env.MbnBuilder 过程解析.41

1.3.3.5.1.1.2.4 env.MbnDummyBuilder 过程解析.42 1.3.3.5.1.1.2.5 fsbl.mbn 生成过程解析.43 1.3.3.5.1.1.2.6 dbl.mbn 生成过程解析.43

1.3.3.5.1.1.2.7 AMSS_AABBQOLYM.mbn 生成过程解析.43 1.3.3.5.1.1.2.8 adsp.mbn 生成过程解析.43 1.3.3.5.1.1.2.9 osbl.mbn 生成过程解析.44

1.3.3.5.1.1.2.10 enandprg_AABBQOLYM.mbn 生成过程解析.44 1.3.3.5.1.1.2.11 nandprg_AABBQOLYM.mbn 生成过程解析.45 1.3.3.5.1.1.2.12 emmcbld.mbn 生成过程解析.45 3.3.3.5.1.1.1 corebsp_scons_done 46 1.3.3.5.1.2 corebsp 46

1.3.3.5.2 corebsp_create_incpaths 46 1.3.3.5.3 corebsp_setup 46 1.3.3.6 libs 46

1.3.3.7 copybar规则解析.47 1.3.3.8 exe规则解析.47

1.3.3.8.1 CORELIBS_AABBQOLYM.mbn生成过程解析.47 1.3.3.8.2 am.mbn 生成过程解析.47 1.3.3.9 bldprod规则解析.48

1.3.3.10 create_mem_feat_html规则解析.48 1.3.3.10.1 50

1.3.3.11 partition规则解析.50

1.3.3.11.1 eMCC 启动和 NAND 启动的分区格式是不一样的,如果是 eMCC 启动,多了编译选项:.50

1.4 高通平台 7630 启动流程分析.52 1.4.1 启动流程概述.52 1.4.2 pbl 流程.52 1.4.3 dbl 流程.52 1.4.4 osbl 流程.54

1.4.4.1 osbl 装载 appsbl 过程分析.56

1.4.5 appsbl 流程(源代码在 android中).56

1.4.5.1 aboot_init 过程分析(需要侧重关心的部分).58 1.4.5.1.1 fastboot 模式分析.61

1.4.5.1.1.1 什么是 fastboot 模式.61

1.4.5.1.1.2 fastboot 模式与 recovery 模式的区别.61 1.4.5.1.1.3 怎样进入 fastboot 模式.62

1.4.5.1.1.4 android 系统手机刷机过程分析(补充知识) 62 1.4.5.1.2 appsbl 引导 android 系统.63

1.4.5.1.2.1 Android 系统启动过程中存在的问题.67 1.4.5.1.1.1.1 linker 问题导致系统无法启动.67 1.4.6 AMSS 流程.69

1.5 android 系统重启关机流程分析.82 1.5.1 c语言中调用 reboot 函数.82 1.5.2 通过 adb 让系统重启.82

1.5.3 fastboot 模式下系统重启.83 1.5.4 系统关机.84

1.5.5 内核中的系统调用 reboot 85 1.6 软件调用流程分析.89 1.6.1 设置sim卡状态.89 1.6.2 设置背光.90 1.6.3 获取电池信息.90

1.7 python scons 语法学习.94 1.8 python 语法学习.94 1.8.1 Python中文全攻略.94

1.8.2 推荐一款Python编辑器.94

1.8.3 使用 pyExcelerator 读 Execl 文件.94 1.8.4 xlrd 解析 xls 文件.95 1.8.5 xlrd 生成 xls 文件.95

1.9 Python 语言之 scons 工具流程分析.95 1.9.1 Program 方法.100 1.9.2 Library 方法.100

2、高通常用工具使用.101 2.1 QPST 101 2.2 QXDM 101 2.3 QCAT 101

3、工程模式.101

4、Android 系统更新升级总结.104 4.1 刷机基本知识.104

4.1.1 各品牌代表手机刷机模式进入方法.104 4.1.1.1 HTC G1 104

4.1.1.2 三星 Galaxy i7500 104 4.1.1.3 Google Nexus One 105 4.1.2 fastboot 模式.105

4.1.2.1 fastboot 模式概述.105

4.1.2.2 PC端fastboot 命令分析.106 4.1.2.2.1 命令选项 –w –s -p –c 106 4.1.2.3 手机端fastboot 命令分析.107 4.1.2.3.1 boot 107 4.1.2.3.2 erase 107 4.1.2.3.3 flash 107 4.1.2.3.4 continue 107 4.1.2.3.5 reboot 107

4.1.2.3.6 reboot-bootloader 107 4.1.2.3.7 getvar 107 4.1.2.3.8 download 108 4.1.2.3.9 update 108

4.1.2.3.9.1 system/core/fastboot/fastboot.c:294: 108 4.1.2.3.9.2 fprintf(stderr, "archive does not contain '%s'\n", name); 108 4.1.2.4 fastboot 模式流程分析.108 4.1.3 recovery 模式.108

4.1.3.1 recovery 模式概述.108 4.1.3.2 软件升级包.109

4.1.3.3 recovery v1跟recovery v2的区别.109 4.1.3.4 软件升级脚本语法解析.109 4.1.3.4.1.1 mount 110 4.1.3.4.1.2 getprop 111

4.1.3.4.1.3 file_getprop 111 4.1.3.4.1.4 aert 111 4.1.3.4.1.5 format 111

4.1.3.4.1.6 apply_patch_check 111 4.1.3.4.1.7 apply_patch_space 111 4.1.3.4.1.8 apply_patch 111

4.1.3.4.1.9 package_extract_file 112 4.1.3.4.1.10 ui_print 112

4.1.3.4.1.11 META-INF/com/ MSM平台上的AMSS http://blog.csdn.net/yili_xie/archive/2010/01/04/5129469.aspx

1.2.2 选择合适的源代码以及工具 要编译出可供烧写使用的镜像文件需要三部分代码: 1) 获取经过高通打补丁的 android 源代码 2) 获取高通针对不同处理器的 vendor 源代码 3) 获取 modem 源代码

1.2.2.1 获取经过高通打补丁的android 源代码 网址:

https://www.daodoc.com/wiki/QAEP#Branch_Releases https://www.daodoc.com/xwiki/bin/QAEP/eclair https://www.daodoc.com/xwiki/bin/QAEP/eclair_caramel https://www.daodoc.com/xwiki/bin/QAEP/froyo_almond

目前使用的 android 分支: Android 2.1 版本 eclair

M7630AABBQMLZA1150 msm7630 eclair M7630AABBQMLZA1150.xml 2010年02月01日

M7630AABBQMLZA1200 msm7630 eclair M7630AABBQMLZA1200.xml 2010年03月30日

M7630AABBQMLZA2010 msm7630 éclair M7630AABBQMLZA2010.xml July 02, 2010 M7630AABBQMLZA1240 msm7630 eclair_caramel M7630AABBQMLZA1240.xml 2010年05月31日

M7630AABBQMLZA1250 msm7630 eclair_caramel M7630AABBQMLZA1250.xml 2010年06月15日

M7630AABBQMLZA1280 msm7630 eclair_caramel M7630AABBQMLZA1280.xml 2010年08月03日 M76XXTSNCJNLYA5340 msm7627 eclair_chocolate M76XXTSNCJNLYA5340.xml 2010年06月04 Android 2.2 版本 froyo

M7630AABBQMLZA2020 msm7630 froyo M7630AABBQMLZA2020.xml 2010年09月01 M76XXTSNCJNLYA6050 msm7627 froyo_almond M76XXTSNCJNLYA6050.xml 2010年10月29日

以下命令获取代码:

https://www.daodoc.com/xwiki/bin/QAEP/froyo_almond ac_root=/home/shared/qualcomm ac_root=/mnt/shared/qualcomm/ ac_date=20101105 ac_branch=froyo_almond build_id=M76XXTSNCJNLYA6050 ac_xml=M76XXTSNCJNLYA6050.xml

mkdir -pv $ac_root/$ac_branch-$build_id-$ac_date cd $ac_root/$ac_branch-$build_id-$ac_date repo init -u git://codeaurora.org/platform/manifest.git -b $ac_branch -m $ac_xml nohup repo sync&

1.2.2.2 获取高通针对不同处理器的vendor源代码

根据选择的 Android 源代码分支不同, vendor 代码的选择也是不一样的,BUILD ID 必须一致

M7630AABBQMLZA1150 对应 HY11-VR881-5.zip M7630AABBQMLZA1250 对应 HY11-VR881-11.zip M7630AABBQMLZA2020 对应 HY11-N1627-3.zip AMSS 7X30 LINUX RELEASE 2.0.20 M76XXTSNCJNLYA6050 对应 HY11-N1188-6.zip AMSS 7X27 LINUX REL 6.0.50 vendor 代码通过有效的高通帐号登录 HYPERLINK "https://support.cdmatech.com/login/" https://support.cdmatech.com/login/ 网站获取

1.2.2.3 获取 modem 源代码

根据硬件配置情况,选择不同的 BUILD ID, 然后根据 BUILD ID 选择相近的源代码

modem 代码通过有效的高通帐号登录 HYPERLINK "https://support.cdmatech.com/login/" https://support.cdmatech.com/login/ 网站获取

BUILD ID 是一组字母的组合,如:AAABQOLYM 以下分别对各个字段进行说明:

第三个字母 A 表示 LPDDR2 #USES_LPDDR2=yes 第三个字母 B 表示 LPDDR1 第六个字母 M 表示 Multimode 第六个字母 C 表示 CDMA 第六个字母 D 表示 JCDMA #相对于C多了:USES_UMTS=yes USES_DSHDR_JCDMA_APIS=yes 第六个字母 O 表示 UMTS only #相对于C多了:USES_UMTS=yes USES_SUPPORT_UMTS_GPS_PROTOCOLS=yes #相对于C少了:USES_CDMA=yes USES_HDR=yes USES_REL_C=yes USES_CDMA2000=yes #USES_EXPORT_MCCMEID=yes USES_SUPPORT_CDMA_GPS_PROTOCOLS=yes 第7,8个字母为 AZ 表示 NADN boot 第7,8个字母为 LY 表示 eMMC boot #相对于AZ多了选项: USES_SDCC_BOOT=yes USES_HSU_MS_FD_BOOT=yes 最后一个字母为 M 表示 modem 最后一个字母为 A 表示 app

以上为 7x30平台的一些规律,具体参考文档,7227 参考相应的 release note: >第1个字母

第2个字母 F: 基于ffa参考设计 S: 基于surf的参考设计 第3个字母 第4个字母 第5个字母 K /J K 相对于 J 多了以下选项 USES_HSU_CHG_BOOT=yes USES_HSU_FAST_CHARGE=yes USES_CHARGER=yes USES_EBI1_TURBO_FFA=yes 第6个字母 O/ N / P

O表示只支持 UMTS(WCDMA) ------------------ USES_IPHC=yes USES_PDCP=yes USES_SUPPORT_UMTS_GPS_PROTOCOLS=yes USES_UMTS=yes ----------------- P表示只支持 CDMA/CDMA2000 USES_CDMA=yes USES_CDMA2000=yes USES_REL_C=yes USES_SUPPORT_CDMA_GPS_PROTOCOLS=yes USES_EXPORT_MCCMEID=yes USES_HDR=yes ----------------- N表示既支持 UMTS(WCDMA) 且支持 CDMA/CDMA2000

第7个字母 第8个字母

surf和ffa的区别

generally speaking surf have FPGA and don't have battery.and FFA don't have FPGA but have battery.msm7627_surf and msm7627_ffa and msm7627_7x_surf means different hardware reference design.please check with your hardware engineer on which qualcomm hardware reference you use and then select the right build command.

4.6 Build commands To create an AMSS build, run the command script with the build ID matching the build configuration desired.The command scripts may be executed from the build/ms subdirectory or from the AMSS root directory using the full path to the command script as in the following examples: ./AMSS/products//build/ms/MSNCJNLYM.cmd – For SURF multimode build ./AMSS/products//build/ms/MSNCJOLYM.cmd – For SURF UMTS only build ./AMSS/products//build/ms/MSNCJPLYM.cmd – For SURF 1X only build ./AMSS/products//build/ms/MFNCKNLYM.cmd – For FFA multimode and for reference only

以高通的开发板子为例,看如何选择源代码,通过 QPST 连接高通的开发板,我们可以看到他的配置信息如下:

高通 demo 版的配置情况:SURF-MSM7630 7X30A-AAABQMAZM-1200 从配置情况来看只有 HY11-N0216-3_1.2.00 HY11-N0216-4_1.2.20 满足要求 HY11-N0216-3_1.2.00/AMSS/products/7x30/build/ms/AAABQMAZM.cmd HY11-N0216-4_1.2.20/AMSS/products/7x30/build/ms/AAABQMAZM.cmd 后期我们要跟据实际情况来选择 BUILD ID,如我们的手机的配置情况为: LPDDR2 ,WCDMA,eMMC 启动(NAND备选),那么modem 的BUILD ID为: AAABQOLYM 或者 AAABQOAZM AAABQOLYM HY11-N0723-2_1.2.20/AMSS/products/7x30/build/ms/AAABQOLYM.cmd AAABQOAZM HY11-N1122-1_1.2.20/AMSS/products/7x30/build/ms/AAABQOAZM.cmd (NABD boot 备选) 高通的Android第一人晓峰不建议我们第一次就用eMMC,而应该用Nand,目前只有HTC在用eMMC。高通在eMMC上面提供了参考代码,但是是未经过验证。终端厂商在使用过程中,一定会有很多问题需要自己解。

补充信息:

现在可能用到 BUILD ID 以及相应的 modem 和 vendor 源代码。 modem代码:

BUILD ID modem 源代码 modem镜像 说明文档

M7630AABBQMAZM1200 HY11-N0216-3.zip HK11-N0216-3.zip HT11-N0216-3.zip M7630AABBQMAZM1220 HY11-N0216-4.zip HK11-N0216-4.zip HT11-N0216-4.zip -- M7630AABBQMLYM1200 HY11-N0723-1.zip HK11-N0723-1.zip HT11-N0723-1.zip M7630AABBQMLYM1220 HY11-N0723-2.zip HK11-N0723-2.zip HT11-N0723-2.zip -- M7630AAABQCAZM1220 HY11-N1122-1.zip HK11-N1122-1.zip HT11-N1122-1.zip M7630AAABQCAZM1240 HY11-N1122-2.zip HK11-N1122-2.zip HT11-N1122-2.zip M7630AAABQCAZM1250 HY11-N1122-3.zip HK11-N1122-3.zip HT11-N1122-3.zip M7630AAABQCAZM1260 HY11-N1122-4.zip HK11-N1122-4.zip HT11-N1122-4.zip M7630AAABQCAZM1280 HY11-N1122-5.zip HK11-N1122-5.zip HT11-N1122-5.zip M7630AAABQCAZM1290 HY11-N1122-6.zip HK11-N1122-6.zip HT11-N1122-6.zip -- M7630AAABQMAZM1240 HY11-N1496-2.zip HK11-N1496-2.zip HT11-N1496-2.zip M7630AAABQMAZM1250 HY11-N1496-3.zip HK11-N1496-3.zip HT11-N1496-3.zip

80-N0216-3_B_M7630AABBQMAZM1200.pdf 5.3.2.1 LPDDR1 NAND boot Multimode AABBQMAZM.cmd 5.3.2.2 LPDDR1 eMMC boot Multimode AABBQMLYM.cmd 5.3.2.3 LPDDR1 eMMC boot UMTS only AABBQOLYM.cmd 5.3.2.4 LPDDR1 NAND boot JCDMA AABBQDAZM.cmd 5.3.2.5 LPDDR2 NAND boot Multimode AAABQMAZM.cmd 5.3.2.6 LPDDR2 eMMC boot Multimode AAABQMLYM.cmd

80-N0216-4_A_M7630AABBQMAZM1220.pdf 5.3.2 Build instructions and commands 5.3.2.1 LPDDR1 NAND boot Multimode AABBQMAZM.cmd 5.3.2.2 LPDDR1 eMMC boot Multimode AABBQMLYM.cmd 5.3.2.3 LPDDR1 eMMC boot UMTS only AABBQOLYM.cmd 5.3.2.4 LPDDR1 NAND boot JCDMA AABBQDAZM.cmd 5.3.2.5 LPDDR2 NAND boot Multimode AAABQMAZM.cmd 5.3.2.6 LPDDR2 eMMC boot Multimode AAABQMLYM.cmd 5.3.2.7 LPDDR2 eMMC boot UMTS only AAABQOLYM.cmd 5.3.2.8 LPDDR2 NAND boot C2K Only AAABQCAZM.cmd 5.3.2.9 LPDDR1 eMMC boot C2K Only AABBQCLYM.cmd 5.3.2.10 LPDDR2 NAND boot JCDMA AAABQDAZM.cmd 5.3.2.11 LPDDR2 NAND boot UMTS only AAABQOAZM.cmd

80-N1665-1_B_M7630AAABQ_AZM1240.pdf 5.3.2 Build instructions and commands 5.3.2.1 LPDDR1/LPDDR2 eMMC boot Multimode AABBQMLYM.cmd 5.3.2.2 LPDDR1/LPDDR2 eMMC boot UMTS only AABBQOLYM.cmd 5.3.2.3 LPDDR1/LPDDR2 eMMC boot C2K only AABBQCLYM.cmd 5.3.2.4 LPDDR2/LPDDR1 NAND boot Multimode AAABQMAZM.cmd 5.3.2.5 LPDDR1/LPDDR2 NAND boot JCDMA AABBQDAZM.cmd 5.3.2.6 LPDDR2/LPDDR1 NAND boot C2K only AAABQCAZM.cmd 5.3.2.7 LPDDR2/LPDDR1 NAND boot UMTS only AAABQOAZM.cmd The same build ID will now work for LPDDR1 as well as LPDDR2.从以上的发布信息,只有 LPDDR2 和 LPDDR1 不同的情况下可以使用同一个 build ID。

对于我们的硬件配置情况(LPDDR2 eMMC boot UMTS only) 可以使用的编译命令文件为:

AAABQOLYM.cmd AABBQOLYM.cmd 选择 modem 代码 M7630AAABQMAZM1250 HK11-N1496-3.zip

如果是支持 BREW平台,通常多下面的选项: USES_BREW_4.0=yes USES_BREW=yes USES_BREW_APPMGR=yes 或者 USES_BREW_USB_HID=yes 没有 USES_DIAG_SMD_SUPPORT=yes

项目 PD1007 OEM/Target Equipment (FeaturePhone,Smartphone,Datacard): Smartphone Anticipated Launch Date: April 1 2011 Target market (such as China Telecom): China Open market Current Software (such as Q6270BKPRZL1505): froyo-M76XXTSNCJNLYA7010 Bluetooth IC/Module (vendor name and module if support BT): BTS4025 WLAN IC/Module (vendor and module if support WLAN ):WCN1312 Chipset (such as QSC6270):MSM7227-1 RF chipset (such as RGR6240):RTR6285 PMIC chipset (such as PM7540):PM7540 WCMDA Supported Bands (900,1900,2100„.if support WCDMA):2100 CMDA Supported Bands (450,850,1900,2100„ if support CDMA ):not suport OS (Brew,BMP,Android,WM,ThinUI(no UI)„):android froyo OS version (Android Donuts„): android froyo

1.2.2.3.1 高通 modem 源代码编译前的修正

从高通获取的源代码直接编译会存在一些问题,以下为可能的问题以及解决方法:

1) 为相应的脚本加上编译选项

vim ./AMSS/products/7x30/build/ms/xxxxxx.cmd 加上: BUILD_UNIX=yes

2) 如果编译过程出现 .pl 文件没有执行权限而退出,那么为工程下面所有的 pl 文件加上可执行属性,命令:

find ./ -name "*.pl" |xargs chmod 755

3) 无法找到需要的 pl 脚本解析器

vim ./AMSS/products/7x30/tools/build/depgen.pl 修改

#!/pkg/perl/5.6.1/bin/perl -w 为

#!/usr/bin/perl -w

4) 如果出现错误:

"AMSS/products/7x30/core/bsp/build/data/incpathsaaabqmlym.py", line 14 IndentationError: expected an indented block 修改文件:./AMSS/products/7x30/core/bsp/build/scripts/genpaths.pl 内容:

#if ($line =~ /^# makefile \(from/) 为:

if ($line =~ /^# makefile /) 原因分析:

genpaths.pl 会对编译过程的中间信息 : ...line=# makefile (from'incpaths.min',line 363) line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc ...等信息进行解析,由于我们使用的是中文系统,所以以上内容变为: line=# makefile (从'incpaths.min',行 363) line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc 所以导致:

#if ($line =~ /^# makefile \(from/) 判断条件为为 false 无法正确生成 incpathsaaabqmlym.py,python 在解析该文件的时候认为存在语法错误。

在 modem 代码 M7630AABBQMAZM2020(HY11-N2280-2.zip)中开始使用 genincpaths.py 产生

./AMSS/products/7x30/core/bsp/build/data/incpathsaaabqoazm.py 文件,所以修改文件 amend-source-code-qualcomm-modem.sh 在脚本中需要加入以下内容: incpathsxxx_py=$PRODUCT_DIR/core/bsp/build/scripts/genincpaths.py if test -f $incpathsxxx_py; then PERL=`which /usr/bin/perl` sed -i "s/(from//g" $incpathsxxx_py fi ./AMSS/products/7x30/multimedia/audio/drivers/Adie/AdieCodecDb/src/DALAdieCodecDb.c #DalAdieCodecDbInternal.h 改为: #include "DALAdieCodecDbInternal.h"

5) 如果出现 make: execvp: ../../../../platform/cs/bin/cifc: Permiion denied 错误,执行以下命令:

chmod -R 755 AMSS/platform/cs/bin/*

1.2.3 建立 Android 开发环境 (略)

curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo export PATH=~/bin:$PATH 1) 安装基本软件

sudo apt-get install git-core gnupg flex bison gperf build-eential zip curl sun-java5-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

2) 安装 sun-java5-jdk ubuntu 下通过命令: sudo apt-get install sun-java5-jdk 将会安装下面的包 sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre sun-java5-plugin 如果ubuntu 发布版本中没有 sun-java5-jdk 那么 sudo vim /etc/apt/source.list #for sun-java5-jdk deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse sudo apt-get update sudo apt-get sun-java5-jdk 或者,如果 ubuntu 版中不支持 apt-get ,那么用手动安装: sudo mount -t nfs 172.20.127.15:/home/shared /mnt sudo dpkg -i /mnt/tools/debs/java-1.5.0-sun/sun-java5-*

3) 配置usb cd /etc/udev/rules.d/ sudo vi 50-android.rules # adb single interface device SUBSYSTEM=="usb_device", SYSFS{idVendor}=="18d1", SYSFS{idProduct}=="d00d", MODE="0664", GROUP="plugdev" # adb composite interface device SUBSYSTEM=="usb_device", SYSFS{idVendor}=="18d1", SYSFS{idProduct}=="deed", MODE="0664", GROUP="plugdev" # Sooner low-level bootloader BUS=="usb", SYSFS{idVendor}=="0bb4", SYSFS{idProduct}=="0a51", MODE="0664",GROUP="plugdev" sudo /etc/init.d/udev restart

1.2.4 建立 modem 开发环境

与android 源代码不同,modem 编译工具使用的是 RVDS ,实际上只用到其中的 RVCT 编译器, 高通不提供该工具,我们必须从arm公司获取相应的授权,RVDS 是 ADS 的升级版本,从 ADS 1.2 开始到 RVDS 3.1 我们公司都有其授权,按照高通的要求我们目前必须使用 RVDS 2.2 并且使用他的 349 patch。 RVDS 2.2 安装以及使用步骤如下:

1).RVDS 2.2 共享在 172.20.127.15:/home/shared/ 目录 sudo mount -t nfs 172.20.127.15:/home/shared/ /mnt cd /mnt/qualcommon/RVDS-2.2/ linux下rvds2.2的安装程序为:

./rvds2.2_linux-pentium/setuplinux.bin 执行以上命令,按照默认步骤安装,安装路径为:~/ARM 注意事项:

安装过程如果出现错误:

..................java.lang.UnsatisfiedLinkError: /tmp/ismp001/6073753.tmp: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory 从网上下载 libstdc++-libc6.2-2.so.3 拷贝到 /usr/lib 目录 ,或者从下面地址获取:

http://172.20.127.15/repositories/DocsAndTools/Tools/Qualcomm/RVDS-2.2-patch/patch/libstdc++-libc6.2-2.so.3 工具的安装通过脚本进行了简化,具体过程请参考文档: 80-N0216-2_A_M7630AABBQMAZM1170.pdf 80-VR881-7_B_M7630AABBQMLZA1200.pdf 80-VR192-1_C_AMSS_Linux_Software_Users_Guide.pdf 80-VR192-1_D_AMSS_Linux_Software_Users_Guide.pdf

2) 安装高通指定的 593 patch cd /mnt/qualcommon/RVDS2.2/下执行命令: ./setup-patch-rvct2.2-bin593-lib349.sh

目前版本只支持 32 位的系统 1.2.4.1 补充

vim ./AMSS/products/7x30/core/bsp/build/scripts/defaults.py 定义了工作线程

#num_jobs = num_cpu * 2 modified by mhf num_jobs = 2 if num_jobs 8: num_jobs = 8 env.SetOption('num_jobs', num_jobs) ――――――― 获取 RVDS 官方网站下载评估版本

https://silver.arm.com/browse http://www.daodoc.com/wiki/QAEP#Branch_Releases https://www.daodoc.com/wiki/QLBEP 下载 M7630AABBQMLZA1150 分支:

February 1, 2010 M7630AABBQMLZA1150 msm7630 eclair M7630AABBQMLZA1150.xml 命令如下:

mkdir -pv ~/workspace/gphone/eclair-M7630AABBQMLZA1150-20100201 cd ~/workspace/gphone/eclair-M7630AABBQMLZA1150-20100201 repo init -u git://codeaurora.org/platform/manifest.git -b eclair -m M7630AABBQMLZA1150.xml nohup repo sync 代码下的 vendor/qcom-proprietary 来自包 HY11-VR881-5.zip 以上两部分代码已经下载并且合并,共享在:

http://172.20.127.15/repositories/TD1002/trunk/eclair-M7630AABBQMLZA1150 --------------- 编译 eclair 代码

svn co http://172.20.127.15/repositories/TD1002/trunk/eclair-M7630AABBQMLZA1150 cd eclair-M7630AABBQMLZA1150 cd eclair-M7630AABBQMLZA1150$ ../setenv.sh ../make-image.sh ======= modem代码从高通网站:https://support.cdmatech.com/login/ 上获取 我们目前使用的是: 共享在:

http://172.20.127.15/repositories/TD1002/trunk/modem-M7630AABBQMAZM1220 ------- 编译 modem 代码

svn co http://172.20.127.15/repositories/TD1002/trunk/modem-M7630AABBQMAZM1220 cd modem-M7630AABBQMAZM1220 ../setenv-qualcomm.sh ../make ======== 编译结果分别如下: ------------ 其中 adsp.mbn,am.mbn,dbl.mbn,osbl.mbn,partition.mbn 位于以下目录: ./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/adsp.mbn ./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/am.mbn ./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/dbl.mbn ./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/osbl.mbn ./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/partition.mbn ------------ appsboot.mbn,boot.img,system.img,userdata.img 位于以下目录: ./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/appsboot.mbn ./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/boot.img ./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img ./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img ./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img.ext3 ./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img.ext3 ------------ eMMC 启动使用的是 ext3 文件系统,需要使用镜像 system.img.ext3 userdata.img.ext3 补充说明:

partition.mbn 文件的原始数据来自配置文件:

./AMSS/products/7x30/tools/jsdcc/partition_load_pt/partition.xml

1.3 高通平台,android和 modem 编译流程分析 android 代码编译流程分析 modem 代码编译流程分析 1.3.1 android代码编译流程分析

1.从服务器下载 android 源码到当前目录

http://smartphone/repositories/TD1014/branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/ svn co http://172.20.127.15/repositories/TD1014/trunk/froyo_almond-M76XXTSNCJNLYA6050/ cd froyo_almond-M76XXTSNCJNLYA6050/ ../setenv.sh 设置环境变量 Setting Environment ...通常情况下 generic 用于编译模拟器版本 Options are: 1.generic 2.msm7627_surf 3.msm7627_ffa 4.tiny-system ====从以上列表中选择==== Which would you like? [1]

烧录的镜像文件appsboothd.mbn appsboot.mbn boot.img system.img userdata.img persist.img 来自 android 源码 appsboot.mbn 的主要功能是装载 linux 内核,通过 linux 的引导来完成 android 系统的加载,

appsboot.mbn 被烧写在相应的分区,它的加载由 osbl.mbn 来完成, osbl.mbn 程序来自 modem。

7x30 7x27 系列 appsboot 不一样,7x30 的 appsboot.mbn 是 7x27 appsboothd.mbn appsboot.mbn 两个文件的合并

1) appsboot.mbn 生成过程解析

2) boot.img 生成过程解析,怎样手动生成 boog.img

1.3.1.1 编译工具检测

make out/target/product/msm7630_surf/appsboot.mbn 1.3.1.1.1

1.3.1.2 appsboot.mbn 生成过程解析

make out/target/product/msm7630_surf/appsboot.mbn make out/target/product/msm7630_surf/nandwrite make out/target/product/msm7630_surf/emmc_appsboot.mbn 分别执行:

make -C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ msm7630_surf make -C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 make -C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_EMMC_OBJ msm7630_surf EMMC_BOOT=1 生成 nandwrite =============== #build nandwrite as a part of Android Build TARGET_NANDWRITE := $(PRODUCT_OUT)/obj/nandwrite/build-$(TARGET_PRODUCT)_nandwrite/lk NANDWRITE_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/nandwrite

nandwrite_clean: $(hide) rm -f $(TARGET_NANDWRITE) $(hide) rm -rf $(NANDWRITE_OUT)

$(NANDWRITE_OUT): mkdir -p $(NANDWRITE_OUT)

$(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT) @echo $(TARGET_PRODUCT)_nandwrite $(MAKE) -C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT) $(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1 ================

vim ./bootable/bootloader/lk/makefile:98: TARGET := msm7630_surf #./bootable/bootloader/lk/project/msm7630_surf.mk PLATFORM := msm7x30 #./bootable/bootloader/lk/target/msm7630_surf/rules.mk msm7x30 msm7630_surf.mk msm7630_surf_nandwrite ============================= include project/$(PROJECT).mk include target/$(TARGET)/rules.mk include target/$(TARGET)/tools/makefile include platform/$(PLATFORM)/rules.mk include arch/$(ARCH)/rules.mk include platform/rules.mk include target/rules.mk include kernel/rules.mk include dev/rules.mk include app/rules.mk ...include make/module.mk ...include make/build.mk ======================== vim bootable/bootloader/lk/make/module.mk INCMODULES := $(MODULES) $(info including $(INCMODULES)) include $(addsuffix /rules.mk,$(INCMODULES)) 展开为: ./bootable/bootloader/lk/app/nandwrite/rules.mk ./bootable/bootloader/lk/dev/fbcon/rules.mk ./bootable/bootloader/lk/dev/keys/rules.mk ./bootable/bootloader/lk/lib/debug/rules.mk ./bootable/bootloader/lk/lib/heap/rules.mk ./bootable/bootloader/lk/lib/libc/rules.mk ./bootable/bootloader/lk/lib/ptable/rules.mk ======================== bootable/bootloader/lk/make/build.mk:29: include arch/$(ARCH)/compile.mk

./bootable/bootloader/lk/project/msm7630_surf_nandwrite.mk 中有: MODULES += app/nandwrite ./bootable/bootloader/lk/platform/msm7x30/rules.mk中有: MODULES += dev/fbcon ./bootable/bootloader/lk/kernel/rules.mk 中有: MODULES += lib/libc lib/debug lib/heap ./bootable/bootloader/lk/target/msm7630_surf/rules.mk 中有: MODULES += dev/keys lib/ptable 所以:

MODULES= app/nandwrite dev/fbcon dev/keys lib/debug lib/heap lib/libc lib/ptable 因为

ifeq ($(BUILD_NANDWRITE), 1) APPSBOOTHDR_FILES := else out/host/linux-x86/bin/acp -fpt out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk out/target/product/msm7630_surf/nandwrite

25780 184 34000 59964 ea3c ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk arm-eabi-objcopy -O binary ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.bin generating listing: ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.lst generating listing: ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.debug.lst generating symbols: ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.sym generating size map: ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.size make[2]:正在离开目录

/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk make[1]:正在离开目录

/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk target Prebuilt: (out/target/product/msm7630_surf/nandwrite)

make -C bootable/bootloader/lk BOOTLOADER_OUT=./out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 make[2]: 正在进入目录

`/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk` msm7630_surf_nandwrite make -C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 ==》生成 mkheader 工具

gcc target/msm7630_surf/tools/mkheader.c -o target/msm7630_surf/tools/mkheader

$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld @echo generating $@ @$(MKDIR) $(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/" $@

generating ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/system-onesegment.ld compiling arch/arm/crt0.S compiling arch/arm/crt0.S 。。。compiling lib/ptable/ptable.c compiling lib/ptable/ptable.c

vim bootable/bootloader/lk/platform/msm7x30/rules.mk ----- LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld include platform/msm_shared/rules.mk -----

./build/core/product_config.mk:177:TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE) ./build/core/envsetup.mk:152:OUT_DIR := $(TOPDIR)out ./build/core/envsetup.mk:159:TARGET_OUT_ROOT_release := $(OUT_DIR)/target ./build/core/envsetup.mk:161:TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE)) ./build/core/envsetup.mk:178: TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product ./build/core/envsetup.mk:184:PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE) build/core/envsetup.mk:200:TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj bootable/bootloader/lk/AndroidBoot.mk:4:BOOTLOADER_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_OBJ bootable/bootloader/lk/makefile:32:BUILDDIR := $(BOOTLOADER_OUT)/build-$(PROJECT) bootable/bootloader/lk/makefile:34:OUTELF := $(BUILDDIR)/lk 所以:

TARGET_PRODUCT_OUT_ROOT=out/target/product/ PRODUCT_OUT=out/target/product/msm7630_surf/ TARGET_OUT_INTERMEDIATES=out/target/product/msm7630_surf/obj/ BOOTLOADER_OUT=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/ 所以:

BUILDDIR=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf 所以:

OUTELF=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk

make -C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ msm7630_surf

bootable/bootloader/lk/makefile OUTELF := $(BUILDDIR)/lk ./bootable/bootloader/lk/make/build.mk $(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT) @echo linking $@ $(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS) $(LIBGCC) -o $@

vim ./bootable/bootloader/lk/AndroidBoot.mk TARGET_NANDWRITE := $(PRODUCT_OUT)/obj/nandwrite/build-$(TARGET_PRODUCT)_nandwrite/lk $(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT) @echo $(TARGET_PRODUCT)_nandwrite $(MAKE) -C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT) $(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1

BOOTLOADER_EMMC_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_EMMC_OBJ

vim ./bootable/bootloader/lk/make/build.mk $(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT) @echo linking $@ $(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS) $(LIBGCC) -o $@

bootable/bootloader/lk/makefile:33:OUTBIN := $(BUILDDIR)/lk.bin bootable/bootloader/lk/makefile:34:OUTELF := $(BUILDDIR)/lk

./lk/platform/msm7x30/rules.mk:23:LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld

==》链接 lk linking ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk linking ../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk generating image: ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.bin generating image: ../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin text data b dec hex filename 29592 7388 42720 79700 13754 ../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk text data b dec hex filename 25780 184 34000 59964 ea3c ../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk

==》以 binary 格式,把文件

out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk 输出到:

out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin arm-eabi-objcopy -O binary out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin ==》

生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.lst 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.debug.lst 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.sym 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.size make[1]:正在离开目录 /opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk ==》

make -C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi- msm7630-perf_defconfig make[1]: 正在进入目录

/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/kernel generating symbols: ../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.sym generating size map: ../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.size

mkheader 从 lk.bin 生成 appsboothd.mbn 语法: mkheader 然后把 appsboothd.mbn 和 lk.bin 合并为文件 appsboot.mbn,删除 appsboothd.mbn 文件 appsboothd.mbn 大小 40K ./bootable/bootloader/lk/target/msm7630_surf/tools/mkheader out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin out/target/product/msm7630_surf/appsboothd.mbn 合并 out/target/product/msm7630_surf/appsboothd.mbn out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin 为:

out/target/product/msm7630_surf/appsboot.mbn cat out/target/product/msm7630_surf/appsboothd.mbn out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin >out/target/product/msm7630_surf/appsboot.mbn 删除:out/target/product/msm7630_surf/appsboothd.mbn ==== 1.3.1.3 boot.img 生成过程解析,怎样手动生成 boog.img boot.img 包括两个部分: kernel 和 ramdisk ,通过命令: make out/target/product/msm7630_surf/boot.img showcommands 会自动生成 kernel 和 ramdisk,然后把两者合并制作成烧写的镜像文件:boot.img kernel 为

out/target/product/$TARGET_PRODUCT/obj/KERNEL_OBJ/arch/arm/boot/zImage 或者 out/target/product/$TARGET_PRODUCT/kernel , kernel 是 zImage 的拷贝

编译内核之前必须获取一个默认的配置文件 .config ,此配置文件可以生成,或者来自默认配置,高通中 msm7630_surf 的

默认配置文件名为: msm7630-perf_defconfig 在文件: vendor/qcom/msm7630_surf/AndroidBoard.mk:45 中通过: KERNEL_DEFCONFIG := msm7630-perf_defconfig 进行了指定。 我们可以通过命令:

make -j3 ARCH=arm CROSS_COMPILE=arm-eabi- kernel showcommands 或者通过如下命令一步步完成:

1.获取默认的内核配置并生成.config 的命令如下: make -C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi- msm7630-perf_defconfig -C kernel 告诉 make 进入 kernel 工作目录,到其下面寻找 makefile 文件

O 内核编译的中间文件以及编译结果等都存储在该目录下,此做法的好处是不会在kernel源代码目录下生成垃圾文件

ARCH=arm 告诉系统到 ./kernel/arch/$ARCH/configs/ 目录下找文件 msm7630-perf_defconfig,生成的.config 保存在:

out/target/product/msm7630_surf/obj/KERNEL_OBJ/.config 2.手动编译内核

make -C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ/ 3.如果需要配置内核,使用下面的命令 make kernelconfig 他首先会进入 menuconfig 界面,用户配置完成以后,会把修改后的配置文件$(KERNEL_OUT)/.config 更新为默认的配置文件

cp out/target/product/msm7627_ffa/obj/KERNEL_OBJ/.config kernel/arch/arm/configs/msm7627-perf_defconfig kernel/arch/arm/configs/$(KERNEL_DEFCONFIG)

4.手动生成 ramdisk 执行命令

make out/target/product/msm7630_surf/ramdisk.img showcommands 会用到命令:

out/host/linux-x86/bin/mkbootfs out/target/product/msm7630_surf/root | out/host/linux-x86/bin/minigzip >\ out/target/product/msm7630_surf/ramdisk.img 5.手动生成 boot.img 需要使用命令 mkbootimg ,语法如下: mkbootimg --kernel 内核 --ramdisk ramdisk镜像 --cmdline 命令行 --base 基地址 --pagesize 大小 --output 输出的boot.img ========== KERNEL=out/target/product/$TARGET_PRODUCT/kernel KERNEL=out/target/product/$TARGET_PRODUCT/obj/KERNEL_OBJ/arch/arm/boot/zImage RAMDISK=out/target/product/$TARGET_PRODUCT/ramdisk.img CMDLINE="console=ttyDCC0 androidboot.hardware=qcom" BASE=0x00200000 PAGESIZE=4096 OUTPUT=out/target/product/$TARGET_PRODUCT/boot.img out/host/linux-x86/bin/mkbootimg --kernel $KERNEL --ramdisk $RAMDISK --cmdline "$CMDLINE" --base $BASE --pagesize $PAGESIZE --output $OUTPUT =========================================

编译 bootloader (appsboot.mbn) ,nandwrite 生成过程解析 ./vendor/qcom/msm7630_surf/AndroidBoard.mk:25: include bootable/bootloader/lk/AndroidBoot.mk =================== 因为有:

bootable/bootloader/lk/AndroidBoot.mk:3: TARGET_BOOTLOADER := $(PRODUCT_OUT)/appsboot.mbn INSTALLED_BOOTLOADER_TARGET := $(PRODUCT_OUT)/bootloader file := $(INSTALLED_BOOTLOADER_TARGET)

第15篇:Android开发优势总结(推荐)

Android开发优势总结

来源:扣丁学堂

目前市场上的移动端有两种形式,一种是Android开发,另一种是ios开发,其中Android开发方面的人员要多一些,今天我们就一起来看一下扣丁学堂Android培训讲师解读的Android开发的优势。

Android开发优势:

1、Android价格占优,价廉性能并不低

消费者选择产品,价格是必然要考虑的一大因素,iphone虽好,但是价格让一般人望而却步。苹果就像是宝马、奔驰,虽然大家都认为它很好,但是一般人消费不起,只有看的份。而Android,如同大众,满大街跑的都是,不仅如此,还有一些型号是可以与宝马、奔驰相媲美的。虽然Android平台的手机价廉,但是其性能却一点也不低廉,触摸效果并不比苹果差到哪里去。Android平台简单实用,无论是功能还是外观设计,都可以与苹果一决高下。当消费者考虑价格因素之后,在数量众多的android手机中,消费者总是会找到一款满意的Android手机取代价格高昂的 iPhone。

2、应用程序发展迅速

智能机玩的就是个应用,虽然现在Android的应用还无法与苹果相竞争,但是随着Android的推广与普及,应用程序数在成数量级增长,Android应用在可预见的未来是有能力与苹果相竞争的。而来自Android应用商店最大的优势是,不对应用程序进行严格的审查,在这一点上优于苹果。

3、智能手机厂家助力

苹果的自我中心是它成功的一大法宝,从硬件到软件,到其独特的推广方式。苹果形成了一个很好的很完整的产业链。在一个封闭的圈子中创造一个又一个的奇想,让消费者的体验得到了很大的满足。但是这样并不能使其长期占据有利位置。现在,世界很多智能手机厂家几乎都加入了Android阵营,并推出了一系列的Android智能机。摩托罗拉、三星、HTC、LG、Lumigon等厂家都与谷歌建立了Android平台技术联盟。厂商加盟的越多,手机终端就会越多,其市场潜力就越大。

4、运营商的鼎力支持

在国内,三大运营商是卯足了劲的推出Android智能机。联通的“0元购机”,电信的千元3G,移动的索爱A8i定制机,都显示了运营商对Android智能机的期望。在美国,T-Mobile、Sprint、AT&T和Verizon全部推出了Android手机。此外,日本的KDDI,NTT DoCoMo,Telecom Italia(意大利电信)、T-Mobile (德

国)、Telefónica( 西班牙)等众多运营商都是Android的支持者。有这么多的运营商支持Android,自然会占据巨大的市场份额。相对于Android的运营商联盟,只有AT&T一家运营商销售iPhone。而苹果其特有的自我封闭性,无论是对手机厂商还是对运营商,都带来了一定的威胁性。手机联盟的形成,在一定程度上直指苹果。

5、机型多 硬件配置优

自从谷歌推出Android系统以来,各大厂家纷纷推出自己的Android平台手机,HTC、索尼爱立信、魅族、摩托罗拉、夏普、LG、三星、联想等等,每一家手机厂商都推出了各自的Android手机,机型多样,数不胜数。摩托罗拉的Droid X、三星的Galaxy,HTC从开始的T-Mobile G1到当前的 EVO 4G,每一款都有着优秀的配置,都有可说之处。

6、系统开源 利于创新

苹果的自我封闭性,使其创新必须源自内部。而Android是开源的,允许第三方修改,这在很大程度上容许厂家根据自己的硬件更改版本,从而能够更好的适应硬件,与之形成良好的结合。

扣丁学堂Android视频教程讲师:相比于苹果的封闭,开源能够提供更好的安全性能,也给开发人员提供了一个更大的创新空间,从而使Android版本升级更快。扣丁学堂有大量的的Android视频教程可供Android开发者观看学习,喜欢的话就关注扣丁学堂吧。

第16篇:学习心得:学习Android开发技巧

学习心得:学习Android开发技巧

曾经有在千锋3G学院学习Android开发的我,现将自己的学习心得分享如下,希望能够给更多有这方面学习的网友提供相关信息。

回想起这几个月的学习,使自己对Android开发系统有了更加系统、更加全面的认识,并且使自己的技术水平有了进一步的提高,能在社会上成为更加有竞争力的人。

在千锋的四个月的学习让我懂得了很多,开始的Java基础讲的很细,讲解的不是很快,这样可以让有基础的更好的复习,也可以让没有基础的更容易接受;之后是Android基础,这个阶段主要是让自己了解Android的各种控件的使用,为以后的项目开发打下基础;第三个阶段是项目开发,这一个阶段是最锻炼人的,可以把学到的东西都联系起来,然后进行更好的应用。最后就是就业阶段,就业部的老师都很认真负责,在我毕业前就让我开始为后面的找工作做准备,简历制作好好后又经过老师的改正,让我的简历更有机会被公司选中,还给我讲了一些面试中遇到的问题该怎么去回答。

经过这四个阶段,我学习到的不仅仅是专业的知识,也让我简单的了解到上班的状态,并深刻的体会到细节决定成功的真谛。

学习可以使我们的人生变得更加美满充实。路是自己走出来的,能否走出属于自己的一片天空,全在于自身的努力与坚持,我相信成功总是会留给那些有准备的人。做出你的选择,尝试走出第一步,成功将不会遥远。

同时还要感谢千锋的老师们,他们在我最迷惘的时候给我一些正确的向导!

第17篇:Android高级开发技术教学大纲

《Android高级开发技术》课程教学大纲

课程名称(中文):Android高级开发技术

课程名称(英文):Advanced Android Development Technology 适用专业:计算机科学与技术、软件工程、网络工程 课程类别及课程模块:学科专业课程/特色创新课程 课程编码:11A023 学分/开课学期和周学时/学时类型/折算后总学时:

学分:

开课学期: 6

周学时:2+2 学时类型: 理论+实践

折算后总学时:64 教材名称及作者、出版社、出版时间、版次:《第一行代码Android第2版》,郭霖,北京:人民邮电出版社, 2016 大纲主笔人:樊相奎 大纲审定人:李贵洋

一、课程的目的、要求和任务

近几年移动终端的开发发展迅速,相关公司越来越多,随着时间的推移,预计社会对移动终端开发领域人才的需求量也会迅速增多。据悉,在成都的软件开发企业中,有多数企业都或多或少涉及移动终端开发领域。对于移动终端开发平台,目前市场占有率最高,未来发展最有希望是iOS和Andriod开发平台。其中Andriod由具有极度创新能力的Google公司开发,同时Andriod采用开源方式,引入了大量合作开发伙伴,目前全世界有大量的公司采用Andriod作为移动终端开发平台,包括三星、华为、小米等。

开设本课程的目的是使学生比较全面地了解和掌握移动终端设计的基本概念、原理及相关技术,为以后的深入学习打下坚实的基础。具体要求和任务是掌握Andriod移动终端开发平台的具体开发语言、开发工具、调试方法等相关技术。

二、大纲基本内容及学时分配

(一) Android开发起步(2课时) 1.2.3.4.5.Android平台简介、背景介绍和平台架构 Android开发环境的搭建,相关软件的下载与安装 虚拟设备的创建和使用 创建“Hello Android” Android应用程序的调试

说明:

(1) 基本要求:介绍Android开发起步的相关知识,包括 Android平台Android的背景及其应用程序的框架,通过让学生完成一个hello world app的开发,体验一个android开发过程;

(2) 教学重点:Android平台Android的背景及其应用程序的框架,搭建Android的开发环境,使用开发平台创建Android项目; (3) 教学难点:平台架构,Android应用程序的调试;

(二) Android应用程序的构成(4课时)

1.2.3.4.5.6.7.8.Android系统架构 Activity生命周期 Android界面的布局 服务—Service 三大组件间通信—Intent AndroidManifest.xml解析 共享数据—content Provider 通知用户—Android Notification

9.Android应用程序的生命周期

说明:

(1) 基本要求:主要对Android的基本组件及Android应用程序的构成进行介绍,同时还将对Android应用程序的生命周期进行分析,主要目的是让读者了解Android应用程序的构成,掌握Android基本组件的特性及使用方法。 (2) 教学重点:了解Android应用程序的构成,掌握Android基本组件的特性及使用方法,Activity以及Intent的概念及使用;

(3) 教学难点:掌握应用程序的生命周期以及具体使用场景;

(三) Android布局管理器(4课时)

1.2.3.4.5.6.控件类概述,View类简介、ViewGroup类简介

线性布局,LinearLayout类简介、线性布局案例

表格布局, TableLayout类简介、表格布局案例

相对布局, RelativeLayout类简介、相对布局案例

帧布局, FrameLayout类简介、帧布局案例

绝对布局, AbsoluteLayout类简介、绝对布局案例

说明:

(1) 基本要求:介绍的内容为Android平台下的布局管理器。Android中的布局包括线性布局、表格布局、相对布局、帧布局和绝对布局,分别对每个布局管理器进行详细的介绍。

(2) 教学重点:了解Android平台下的布局管理器及使用方法; (3) 教学难点:布局管理器的嵌套使用,如何合理有效的使用嵌套布局;

(四) Android常用基本控件(2课时)

1.2.文本控件的介绍,TextView类简介、EditText类简介以及使用案例

按钮控件,Button类简介、ImageButton类简介、Patch图片简介以及Patch图片使用案例

3.4.状态开关按钮,ToggleButton类简介以及开关按钮的使用

单选按钮与复选按钮,CheckBox和RadioButton类简介以及单选按钮和复选按钮使用案

5.6.图片控件,ImageView类简介以及图片查看器

时钟控件,AnalogClock和DigitalClock类简介以及时钟控件使用案例 7.日期与时间选择控件,DatePicker类简介、TimePicker类简介以及日期时间控件使用案例

说明:

(1) 基本要求:对进行用户界面开发时常用到的Android基本控件进行介绍,主要包括文本框、按钮、单选按钮和复选按钮、状态开关按钮和日期时间控件等,了解这些基本控件的工作方式有助于学习后面要介绍的Android中的高级控件。 (2) 教学重点:掌握Android基本控件及使用方法; (3) 教学难点:不用布局文件,直接代码生成控件;

(五) Android常用高级控件(4课时)

1.2.3.4.5.6.7.8.自动完成文本框,AutoCompleteTextView类简介以及自动完成文本使用案例

下拉列表控件,Spinner类简介以及下拉列表使用案例

列表视图,ListView类简介以及列表视图使用案例

网格视图,GridView类简介以及网格视图使用案例

画廊控件,Gallery类简介以及画廊控件使用案例

滚动视图,ScrollView类简介以及滚动视图使用案例

选项卡,TabHost类简介以及选项卡使用案例

滑块、进度条与星级滑块,ProgreBar、SeekBar、RatingBar类简介以及使用案例

说明:

(1) 基本要求;上一章已经介绍了Android中的一些基本控件,本章对Android中常用的高级控件逐一进行介绍。

(2) 教学重点:掌握Android常用高级控件及使用方法; (3) 教学难点:BaseAdapter适配器的概念以及使用;

(六) 菜单与对话框(4课时)

1.菜单功能的开发,包括选项菜单和子菜单简介、选项菜单和子菜单使用案例、上下文菜单

2.对话框功能的开发,包括对话框简介、普通对话框、列表对话框、单选按钮对话框、复选框对话框、日期及时间选择对话框、进度对话框

3.消息提示,Toast的使用,Notification的使用

说明:

(1) 基本要求:介绍用户界面中菜单与对话框的开发,同时还会对Android平台下的Toast和Notification进行介绍。

(2) 教学重点:掌握Android常用菜单和对话框的概念和使用; (3) 教学难点:Notification的概念和使用;

(七) Android事件处理模型(2课时)

1.了解Android中的事件处理概念和模型;基于回调机制的事件处理,基于监听接口的事件处理。

2.掌握Android中的事件处理具体方法,包括OnClickListener、OnLongClickListener、OnFocusChangeListener、OnKeyListener、onTouchEvent、OnCheckedChange、OnItemSelected、日期和时间监听事件等;

3.

说明:

(1) 基本要求:对Android平台用户界面的各种事件响应进行详细介绍,加深对Android平台的事件处理模型的理解,熟练掌握控件的各种事件处理方法。

(2) 教学重点:掌握Android中的事件处理概念以及具体的常用事件及其处理方法; (3) 教学难点:理解基于回调机制和基于监听接口事件处理机理;

(八) 消息广播与服务(2课时)

1.2.BroadcastReceiver组件,BroadcastReceiver类简介,基于广播的案例

Service组件,Service类简介,基于服务的案例

说明: (1) 基本要求:在很多应用程序中,都会通过广播形式来发送和接收消息,当应用程序接收到消息后,一般启动一个Activity或者一个Service进行处理。本章对服务组件Service进行详细介绍,章末通过对一个单机版的音乐播放盒的介绍帮助掌握服务组件的使用方法。

(2) 教学重点:对Android的消息广播机制及服务组件运行机理和具体使用方法; (3) 教学难点:广播Broadcast、服务Service的运行机制和处理原理;

(九) 多线程及消息处理(4课时)

1.2.3.4.Android多线程,概述、创建线程、操作线程 UI线程与非UI线程

多线程中的常用类,包括Handler类、AsyncTask类、Timer定时器等 Android多线程通信机制

说明:

(1) 基本要求:了解线程的概念、生命周期,通过实例学习,掌握多线程的创建、使用以及多种具体事项方式。

(2) 教学重点:对Android的多线程运行机理和具体使用方法; (3) 教学难点:线程同步;

(十) 数据处理(4课时)

1.掌握SharedPreferences的使用方法 2.3.4.5.6.掌握各种文件存储的区别与适用情况 了解SQLite数据库的特点和体系结构 掌握SQLite数据库的建立和操作方法 理解ContentProvider的用途和原理(选讲) 掌握ContentProvider的创建与使用方法(选讲)

说明:

(1) 基本要求:本章要介绍访问手机存储卡的方法及如何在程序中使用SQLite数据库。 (2) 教学重点:掌握Android数据存储的相关机制和具体使用方法; (3) 教学难点:SQLite数据库的具体使用;

授课内容及学时说明:前述大纲章节及学时分配是本门课程指导性意见,针对不同专业学生以及具体授课情况,授课教师对具体章节的内容及学时可进行适当调整,但主要章节知识点(除可选部分)需要覆盖到。

三、与其他课程的关系

1.先行课程:数据库原理、Java 2.后续课程:无

四、考核方式

考核形式:考查

评分标准:平时成绩占30%(主要考察课堂与上机考勤、实验等方面),两次阶段性上机考试占40%,期末作品占30%。

五、参考书目

1.明日科技编著,《Android从入门到精通》,北京:清华大学出版社, 2016 2.李刚编著,《疯狂Android讲义(第3版)》,北京:电子工业出版社, 2015 3.(美)Erich Gamma等著,《设计模式》,北京:机械工业出版社,2013

第18篇:Android开发Info类总结

Android开发Info类总结

首先我们来看一下PackageItemInfo,它是包含了一些信息的基类,它的直接子类有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermiionGroupInfo、PermiionInfo。它的间接子类有:ActivityInfo、ProviderInfo、ServiceInfo。这个类包含的信息对于所有包中项目是平等的。这些Package items是被Package manager所持有的。这个类提供了属性的非常普通的基本设置:label、icon和meta-data。这个类的意图不是被自己调用。它在这只是简单地分享被package manager返回的所有items之间的普通定义。比如,它自己并不实现Parcelable接口,但却帮助实现了Parcelable的子类提供了方便的方法。

ApplicationInfo是从一个特定的应用得到的信息。这些信息是从相对应的Androdimanifest.xml的标签中收集到的。

ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的标签收集到的信息。

PackageManager这个类是用来返回各种的关联了当前已装入设备了的应用的包的信息。你可以通过getPacageManager来得到这个类。

ApplicationInfo与ResolveInfo比较:前者能够得到Icon、Label、meta-data、description。后者只能得到Icon、Label。

下面讲一下这几个类综合在一起的具体应用:

通过调用PackageManager的方法可以得到两种不同的信息:

首先要得到manager:

PackageManager manager = getPackageManager();

Java代码:

List appList = manager.getInstalledApplications(PackageManager.GET.UNINSTALLED_PAKAGES);它是通过解析AndroidManifest.xml的标签中得到的,所以它能得到所有的app。

Java代码:

Intent intent = new Intent(Intent.A CTION_MAIN,null);

intent.addCategory(Intent.CATEGORY_LAUNCHER);

List appList = manager.queryIntentActivities(intent,0);

//它是通过解析标签得到有

//这样的app,所以得到的要比第一种方法少(前者比它多那种service、previder等app)。

第19篇:android开发实习报告总结

Android开发实习总结

有一名话叫做:不经过风雨,怎么见彩虹?我想改一下:不真正进入社会,怎能了解社会呢?

在这次实习中,给我收获最大的是我觉得很多工作需要我去摸索和探讨,要不怕吃苦,勇于激流勇进,有的工作虽然单挑又重复,但这是磨练意志最有效的方法,我告诫自己要认真完成,对每项工作都要他看成是公司对自己的一次考核,做到每一件事的过程中遇到困难,一定要争取不抛弃,不放弃,坚持“战斗”,只要希望还在,胜利一定属于我们。

在此次专业实习的过程中,我进入了广州外语通科技有限公司当任Android开发实习生,并参加了两次大项目的研发,从实际到理论,加深了我们对软件技术专业的理解,和对于与社会接轨的深刻感受。

作为学生,我们更多的是课本的知识的理解,理论的优势是我们的特色,但是怎样将理论结合实际却是摆在我们面前的难题。而参观广州外语通科技有限公司正视给了我们直观的解读。广州外语通科技有限公司建立了一整套符合国际标准的质量、成本和交付体系,软件开发质量控制和过程改善能力已达到了国际先进水平,秉承“用开拓的意识、创造新的价值”的企业理念,不断跟踪国际先进技术与管理思想,研发和提供优质软件产品和技术服务,为客户不断创造和提升价值。正是因为秉持这样的理念其完整的价值链和细致的软件服务,给了我们以软件技术专业的具体实际的体验。与此同时,广州外语通科技有限公司企业的参观使我们对中国物流企业的现状有了大概的了解,参观过程中不同仓库的设施和地面的设置的挑选更是让我们多了超出理论的认识。通过指导人员的讲解我们对中国物流企业的信息化有了大致的了解:中国物流企业信息化整体水平不高是其信息化建设的核心问题。这包括:标准不统一,资源浪费严重;大型应用软件系统应用不普遍,应用层次低;现有各软件系统之间相互孤立,形成“信息孤岛”;信息化建设发展不平衡,造成“信息鸿沟”;硬件设备的利用率不高,资源浪费严重;综合信息系统是物流业信息化建设的必然趋势。

如果说前两次的参观实习是给的我们直观的视觉冲突和心理震撼,那么后来的信息化讲座就揭开了信息化和软件技术专业的神秘面纱。通过经验丰富的演讲者的ppt演示我们了解了多个行业的信息化实施过程和具体的商务转变成软件技术专业活动的流程。现实中简单的商务活动一旦设计成成功的xx专业流程将涉及多个业务流程,整体的实施过程是复杂而艰难的。鉴于中国Android专业已经很成熟,各方面的支持还不够很完备,这使得中国Android专业的发展有很大的扩展性。

作为应届毕业生,在毕业前的这次专业实习,无疑是给了我们对Android专业的清晰认识,这也是最为软件技术专业专业的学生的最大感悟。当然实习中还有着更多的感触,包括学习,生活,工作各个方面。

就学习而言,专业实习它更偏重于应用,更加细致,要求也更加严格。作为应届毕业生的我们要想适合自己的工作,在实际中实现自己的理想,必需不断的增加自己的能力,做事情更加专注。

就生活而言,专业学习展示给我们看各个不同的行业的人们的生活,不同行业的人们将自己的行业融入自己的生活,这样大的人群的生活展示给我们未来的生活远景,选择什么样的生活也是我们现在的最重要的抉择。一旦下定决心,也就要开始为自己的生活做准备,胜利是属于有准备的人的。现在的我就要为自己的生活做准备,不断的充实自己。

就工作而言,无疑的本次的xx专业专业实习,展示给我们了多种职业,而作为应届毕业生,择业的选择是大多数人所面对的问题。就我们xx专业而言,面试时常遇见的问题就是“Android专业是干什么的?”或许大多数的学生跟我一样对android专业并没有清晰的概念,所以也并不能很好的回答这样的问题。不管怎样,勤劳的人是让人钦敬的,但所接触的朋友说“多年的工作让我清楚这个社会的运转不是控制在辛勤劳动的人手上,而是那一班根深帝固的政治家、资本家手中...工作中的认真负责不是为了讨好表现,而是为了要冶练自己的品性,是在为自己,不是为老板”。

上面的认识都是正面的,也是自己受益的主要部分,但就个人而言,本次的xx专业实习更多的是让自己认识到自己的不足。作为一个即将毕业的应届生,通过此次的实习,更多的是对大学四年的回顾和反省。进入了社会,和学校的感觉是完全不一样的。只有在刚进入公司的一个月里,大家还把你当作新人,时间久了公司的领导就把你与其它同事相比较;当你开始跑客户时,客户把你与做了很多年的销售相比较,没人把再把你当新人看待,而你把你当作一个正式的有能力的人使用。

看着那些员工忙忙碌碌的来来去去,坚定的态度是那么一点一滴在铸就起来,一个被人认可的人首先一定是一个认真负责的人,一个认真负责的人无论到哪里都可以站得正。相对于经验和技术而言,这些都是可以积累的,可以日久能熟的,但是否能有正确的态度却是因人而异的,有的人永远让人感觉畏锁。我从来没有把现在的工作当作实习,我就是认定我是在工作,而不是来学习东西的。我是为工作而学习,学习是为了把工作做得更好。

总的来说,我们这一次实习是比较成功的,大家都能学习到了很多在校园、在课堂上、课本上学不到的东西,也了解很多和懂得了做人的道理,特别是体会到生活中的艰辛和找工作的不容易。

感谢这次实习,感谢这次实习的教师,感谢为我们争取了这实习机会的领导。这次实习,一定会令我的人生走向新一页!

XXX

2016-01-08

第20篇:android教程JNI开发疑点总结

本文由麦可网http:// 收集整理,转载请注明出处

android教程JNI开发疑点总结

很多Android新手对于JNI开发过程中的疑问不是很清楚,根据android123@163.com邮箱中反馈的内容我们整理如下:

1.JNI中,什么情况才处理jstring、jint、jobject这样的类型,其实通过NDK开发Android C++应用,大部分仍然是常规的cpp和h的标准写法,只有需要和Java层通讯的方法才包含了类似JNIEXPORT void JNICALL XXX这样的函数,大多数的逻辑和标准C/C++没有什么区别。

2.我有一个在Windows上开发好的dll能否在Android上使用呢? 这里Android开发网提醒大家,对于dll这样的PE文件只能在Windows平台下使用,而linux上的动态库so文件如果是PC上的也无法通过JNI在Android上调用,由于CPU的指令不同,手机上必须使用ARM交叉编译器生成才可以使用,而PC上的为x86或64位,即使是Hello World这样代码兼容性很强,也必须在NDK中重新编译才能在Android上使用。

3.学习JNI的基础是什么,或者说什么顺序学习? 这点Android123推荐大家先了解Java的类型,和内部编码,然后学习C/C++语言,对于NDK r5开始支持的C++语言,这里Android开发网要和大家说下了,如果需要在JNI中调用Java的类,你可以学习下反射机制,同时C++ STL在NDK r5开始支持,这样开发应用维护起来更方便些。最后看下NDK的Samples下载Android源码Framework层基本上就没有什么大问题了。

4.学习NDK最大的困难是什么? 这里Android123认为,国内网友大多数都在Windows下做开发工作,整个NDK环境需要Cygwin,同时mk这样的makefile编译脚本的手动编写可能不是很友好,这点Android开发网已经准备了一整套的Android开发工具,将在近期公开,帮助大家在PC辅助开发Android应用,同时常见问题提供了相应的链接。

5.在Android JNI用处大吗? 对于大多数开发者来说可能主要用于OpenGL游戏设计上,不过对于纯运算,算法上C语言比Java有着很多天生的优势,这点不容置疑,多一门技术多一个出路嘛,整个Android源代码十分庞大,开源的力量最终还是能打败更封闭的Windows Phone和iOS的。

android开发试用期工作总结
《android开发试用期工作总结.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题
点击下载本文文档