【Android源码 栏目提醒】:本文主要为网学会员提供“[IT计算机]android 笔记 - 技术总结”,希望对需要[IT计算机]android 笔记 - 技术总结网友有所帮助,学习一下!
《
Android Dev Guide》系列教程1什么是
Android Android是一个移动设备的软件集他包括一个操作系统、中间件和一些重要的应用程序。
AndroidSDK提供了
Android开发平台的必要的工具和APIs他使用Java编程语言。
特点 应用程序框架支持组件的重用和替换。
Dalvik虚拟机转为移动设备优化的虚拟机。
集成的浏览器基于开源浏览器WebKit引擎。
优化的图形图像处理采用定制的2D图形库基于OpenGL ES1.0规范可选的硬件加速。
SQLite结构化的数据存储。
媒体支持支持厂家爱呢的音频视频如MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF。
GSM技术硬件依赖。
蓝牙、EDGE网络、3G、WIFI硬件依赖。
拍照、导航、指南针、加速度计硬件依赖。
丰富的开发环境包括一个虚拟器、调试工具、内存和性能分析、Eclipse插件。
Android 系统结构 下面那张图表显示了
Android操作系统的主要部件每一部分将会详细讲解 。
应用程序
Android 将会有一些核心的应用比如邮件客户端、SMS程序、计算器、地图、浏览器、联系人等等。
所有的应用程序都用Java语言开发。
应用层 通过提供一个开源的平台
Android可以让开发者自由的开发丰富、创新的应用程序。
开发者可以免费利用设备的硬件访问本地信息、启动后台服务、设置闹铃、给状态栏增加提醒功能等等灰常多的应用。
开发人员通过核心应用程序可以完全访问同一框架的APIs。
开发者对于框架APIs的访问有与核心程序同样的权限楼下whyou指正表示感谢。
结构化的应用框架为了提高组件的客服用性而设计。
任何程序都可以公布他的功能让其他程序来调用在框架许可的前提下。
相同的机制允许用户替换掉某些功能。
和所有程序相关的是一些服务和系统包括 一些丰富的可扩展视图可以用来构造应用程序包括列表、表格、输入框、按钮、可以写内置的浏览器。
内容提供可以让程序访问其他程序的数据例如联系人列表或者共享自己的数据。
资源管理器提供访问非代码的资源的方法例如本地化的一些字符串、图像、布局文件。
一个提示管理器可以让程序在状态栏显示自定义的提示信息。
一个Activity管理器管理activity的生命周期并且提供一个公共的导航功能。
更多详细信息可以通过一个例子来学习参考 Noteoad Tutorial。
Libraries
Android包含了一些系统各个部分使用到的C/C库通过
Android应用程序程序框架这些功能对于开发者来说是公开的部分核心库如下 系统C库一个继承自BSD的标准C系统库专门为了嵌入式Linux设为。
多媒体库基于 PacketVideos OpenCORE库支持播放和录制一些主流的音频视频格式像静态图片文件包括MPEG4 H.264 MP3 AAC AMR JPG and PNG格式。
Surface Manager图形管理器管理显示子系统在多个应用程序里无缝综合2D和3D图层。
LibWebCore一个流行的web浏览器引擎供
Android浏览器和内置的浏览view使用。
SGL一个底层的2D图像引擎。
3D库基于OpenGL ES 1.0 的3D图像引擎。
包括硬件加速和优化过的3D软件加速。
FreeType位图和矢量字体的渲染rendering。
SQLite一个强大的轻量级的数据库引擎对所有程序提供使用。
Android 运行时库
Android包含了Java语言的大部分的核心库。
每一个
Android应用程序运行在自己的线程里有自己的dalvik虚拟机实例Dalvik虚拟机被重写用来支持在一个移动设备上支持多个虚 拟机。
Dalvik虚拟机执行文件.dex被优化的内存占用很小。
VM是基于寄存器并且通过Java语言编译器运行由class文件转换的.dex 文件通过内置的dx工具。
Dalvik虚拟机依赖Linux核心来管理线程和底层的内存管理。
Linux kernel:
Android 依赖Linux2.6内核作为核心系统服务像安全、内存管理、进程管理、网络堆、驱动模型。
Kernel扮演者一个软硬件之间的抽象层的角色。
码在最后 终于磕磕绊绊的翻译了一篇太晦涩了lazybone对不住各位看客。
《
Android Dev Guide》系列教程2应用基础之组件1 应用基础
Android是用Java语言写的所有的Java代码和相关的资源文件被AAPT Tool 的工具打成一个
Android包后缀为apk的可运行包。
这种文件专门用来发布 和安装应用程序到移动设备的。
一个APK包里所有的代码都被看做一个程序。
在很多方面每一个
Android应用程序都在自己的世界虚拟机里单独存活。
默认情况下每个应用程序都在自己的Linux进程里。
应用程序的任何一段代码需要执行时
Android都会启动这个进程并且在处理完后要处理其他程 序时关闭这个进程。
每个继承拥有自己的虚拟机所以程序间的运行是互相隔离的。
默认情况下每个应用程序都会分到一个特殊的Linux用户ID并被设置权限只对应用程序自己可见和使用当然可以对其他程序开放。
可以安排两个程序共享一个UserID这样他们可以互相看到对方的文件共享系统资源并且在同一个Linux线程里运行共享虚拟机。
组件
Android的一个核心特点就是一个应用程序可以由其他应用程序的组件来组成在其他程序允许的前提下。
例如如果你的程序需要显示一个图片列表并且另一个程序已经开发了合适的滚动条且允许其 他应用程序添加那么你可以在他的滚动条基础上开发比自己开发要方便的多。
你的程序不需要合并他的代码只需要一个连接即可。
相比之下当我需要某个程序然后可以启动他时是最简单的。
想要这样的话当这个程序的某一部分被别人用到时系统必须能都启动一个应用程序的进程并且实例化这些相关的Java对象因此与其他系统的应用程序不同的是
android程序没有一个单一的入 口程序例如main方法相比下
android有四种基本的组件可以被系统实例化、启动。
包括Activities、Services、Broadcast receivers、Content providers。
Activities Activity提供了一个可视化的用户接口例如一个activity可以提供一个列表供用户选择或者在拍照时显示照片列表。
一个短信程序有一个activity显示联系人列表另一个activity可以写短信 并且选择联系人发送别的activity可以查看以往的短信内容并且更改设置。
这几个activity共同在一个用户界面里发挥着作用他们之间互相依赖每一个都是继承自activity基类的子类。
一个应用程序可以包含一个或者多个activity例如刚提到的短信程序。
需要多少就可以包含多少。
通常被标记的第一个activity先运行。
当前activity启动完就启动下一个。
每个activity都被分配一个默认的窗口来绘制。
通常是全屏也可以比屏幕小或者浮在其他窗口上。
一个activity可以利用额外的窗口例如在activity里探出一个让用户想用的弹出对话框或者显 示一个给用户显示重要信息供用户选择的特殊选项。
窗口的可视内容由层式结构的view来显示他们继承自view基类。
每个view控制一个特定矩形空间内的窗口。
父view控制并且组织子view 的显示。
子view上层的view被绘制在矩形里响应用户的操作 从而与用户交互信息。
例如可以显示一副小图片用户点击图片时响应一个事件。
Android有很多现成的view可以被直接使用包括按钮、文本框、滚动条、菜单、选择框等等。
通过Activity.setContentView可以改变activity的显示content view 是根视图。
Services servers没有用户接界面但它确实在后台不定期的运行着。
例如但用户处理其他事情时一个service可以背景播放音乐、后台读取网络数据或者处理其他的东西并且提供给其他的activity每一个 servers都继承自Service基类。
一个最好的例子就是媒体播放器。
播放器大概需要一个或多个activity来允许用户选择歌曲并且播放。
然而播放器不必是当前活动的activity用户可能在播放时做别的事情。
播放器需要启动一个后 台来持续播放音乐。
系统会一直播放这个播放器service甚至当他隐藏时。
我们可以链接到一个正在运行的service或者启动一个没有运行的service当连接成功时你可以和service的进程通信。
例如播放器用户可以控制他的开始暂停重放等功能。
像activity和其他的组件一样services运行在主线程。
所以不会阻塞其他的组件或者用户界面。
他们往往启动一个新的任务。
可参考Process and Threads。
Broadcast receivers Broadcast receiver这个组件只是接受receive和响应Broadcast广播通知。
很多广播来源系统代码例如通知时区已经改变、低电量、图片被选中、用户改变了语言设置此时用户开始广播例如同 事其他应用程序网络数据已经下载ok可以使用了。
一个Broadcast receiver 可以响应多个广播所有的Broadcast receiver 都继承自BroadcastReceiver基类。
Broadcast receivers 没有用户界面。
然而他们可以在接收到消息启动一个activity或者使用notificationManager 去提醒用户。
Notifications 可以通过一些方式引起用户注意闪动背光、 震动、发声等等。
通常在状态栏显示一个提示图标让用户可以查看。
Content providers 内容提供 Content providers为其他程序提供数据集这些数据可以保存在系统文件里或者sqlite数据库里Content providers继承自 ContentProvider基类实现了一些标准的方法可以 让程序检索或者改写其中的数据。
程序不能直接的调用那些方法。
ContentResolver不能与content provider直接通信但可以用过ContentResolver 。
ContentResolver 可以跟任何的content provider通信可以与provider合作管理通 信进程。
更多信息查看Content Providers文档。
当有需要特定的请求需要被处理时
Android都会确保他正在运行需要时会创建一个实例。
Android Dev Guide》系列教程3应用基bu础之组件篇2 激活组件: intents 当ContentResolver接收到一个请求时运行content providers。
其他三个组件activities、services、broadcast receiver被Intents异步消息启动。
intent 里包含着所传递消息的内容。
对于activity和services来说intents定义了请求指定了目标数据的URI。
例如可以让发送一个请求 让用户接受或者输入一些文本信息。
对broadcast receivers来说intents定义了一些声明的事件例如他可以在相机的按钮被按下时发出一些信息。
下面是每个组件类型对应的启动方法 Context.startActivity 和 Activity.startActivityForResult方法可以启动一个activity。
activity可以查看启动他的的 intent通过调用getIntent方法。
Android 系统调用onNewIntent方法来传递intents。
一个activity经常会启动下一个activity。
使用startActivityForResult 代替 startActivity方法可以从启动的activity获取一些返回值。
例如可以启动一个activity让用户选择一张图片并且返回所选的 图片被传递回来的数据被送到前一个activity的onActivityResult方法里。
Context.startService可已启动一个service。
Android通过service的onStart方法传递 intent对象。
类似的intent可以传递至Context.bindService来获取一个正在运行的服务的句柄这个服务可通过 onBind方法获取这个intent对象如果服务没有启动可以通过bindService来启动服务。
例如一个activity可以很容 易的建立一个到音乐播放服务的连接他可以提供给用户一些控制音乐播放器的借口。
activity可以调用bindService方法来建立连接然 后调用已经定义的关于播放器的一些方法。
应用程序可以通过传递intent来初始化一个Broadcast广播相关方法:Context.sendBroadcast、 Context.sendOrderedBroadcast、Context.sendStickyBroadcast activity会调用所有对此广播关注的广播接收器然后将intent传递给这些方法。
关闭组件 只有当内容提供商从内容接收者接收到一个请求时才会启动。
广播消息接受者只有当接收到一个广播消息时才会被启动。
所以他们不需要手动关闭。
activity则另当别论他们提供给用户界面他们和用户保持长时间的对话并且保持活跃状态甚至空闲时仍然保持联系。
类似的services也会运行很长一段时间。
所以
Android提供关闭activity和services的一些方法 finish会关闭activity那些被startActivityForResult方法启动的activity可以通过finishActivity关闭。
services 可以通过 stopSelf和Context.stopService 方法被关闭。
当系统不再使用他们或者没有足够内存世系统可以自行关闭一些组件后面的章节会讨论这种情况。
manifest 文件 在
Android启动一个应用组件前必须让activity知道那些组件的存在所以应用程序必须在manifest文件里声明自己的组件并把manifest文件打包到
Android 包里。
apk文件包含程序的代码、文件和资源。
manifest是一个结构化的xml文件被命名为AndroidManifest.xml里面声明了应用的组件、一些除了系统默认库的用户自定义库和程序希望被授予的一些权限。
manifest主要任务是告诉
Android应用程序的部件。
例如activity可以这样声明 xhtml view plaincopy 1. ltxml versionquot1.0quot encodingquotutf-8quotgt 2. ltmanifest . . . gt 3. ltapplication . . . gt 4. ltactivity
android:namequotcom.example.project.FreneticActivityquot 5.
android:iconquotdrawable/small_pic.pngquot 6.
android:labelquotstring/freneticLabelquot 7. . . . gt 8. lt/activitygt 9. . . . 10. lt/applicationgt 11.lt/manifestgt ltactivitygt元素的name属性是继承自activity基类的activity的类名icon和label指向了资源文件。
别的组件声明起来就简单的多了。
服务的标签ltservicegt广播接受者标签ltreceivergt内容提供商标签ltprovidergt。
activity、services和内容提供商不在这里声明的话是不能运行的。
然而广播可以在manifest文件里声明或者动态的在代码里创建并且调用Context.registerReceiver方法声明。
Intent filters Intent对象可以显示的定义一个目标组件。
那样的话
Android就可以找到并运行它。
如果目标组件没有明确的定义出来
Android会相 应最佳的组件来响应这个Intent这是通过比较ltintent filtersgt标签里的所有组件来选择相应的。
intent filters Intent过滤器告诉
Android所有可以处理的组件。
和组件的其他重要信息一样在manifest文件里声明。
下面是一个添加了两个Intents过滤器的例子 xhtml view plaincopy 1. ltxml versionquot1.0quot encodingquotutf-8quotgt 2. ltmanifest . . . gt 3. ltapplication . . . gt 4. ltactivity
android:namequotcom.example.project.FreneticActivityquot 5.
android:iconquotdrawable/small_pic.pngquot 6.
android:labelquotstring/freneticLabelquot 7. . . . gt 8. ltintent-filter . . . gt 9. ltaction
android:namequotandroid.intent.action.MAINquot /gt 10. ltcategory
android:namequotandroid.intent.category.LAUNCHERquot /gt 11. lt/intent-filtergt 12. ltintent-filter . . . gt 13. ltaction
android:namequotcom.example.project.BOUNCEquot /gt 14. ltdata
android:mimeTypequotimage/jpegquot /gt 15. ltcategory
android:namequotandroid.intent.category.DEFAULTquot /gt 16. lt/intent-filtergt 17. lt/activitygt 18. . . . 19. lt/applicationgt 20.lt/manifestgt 例子中的第一个过滤器是常见的。
他标记了所有显示给用户让用户选择启动的组件。
换句话说就是程序的入口点。
是用户启动程序后最先见到的。
第二个过滤器声明了可以提供perform的特殊数据类型。
对否呵呵 一个组件可以有数个Intent过滤器。
每一个都可以声明不同的权限。
如果没有添加过滤器的话只能使用Intent方式被启动。
对于广播接受者来说如果在代码中被创建和注册那么直接被实例化成一个IntentFilters对象其他的过滤器都在manifest文件里被声明。
后记 自己都觉得语句不通原谅骨头吧给大家个找错的机会哈哈 2010-08-26 12:06 506人阅读 评论3 收藏 举报 《
Android Dev Guide》系列教程4应用基础之Activities 和任务 向前面说的那样一个activity可以启动另一个activity包括在其他应用程 序里定义的activity。
假如你想让用户显示一些街道地图的位置信息已经存在这样一个功能的activity了所以你只需填好Intent信息并 曾通过startActivity方法传递Intent地图浏览器就会显示地图。
当用户按Back键时会回到原来的activity。
对于用户来说地图浏览器就像你程序的一部分一样尽管他是在另一个应用程序里定义并且运 行的。
Android为了良好的用户体验而让两个activity运行在同一个任务里。
简单地说用户认为一个task就是一个“应用程序”。
应用程序是 一组相关的activity排列在一个堆栈里。
通常堆栈里的主activity会启动用户在启动器里选择的那个activity。
栈顶的 activity就是当前运行的得到用户焦点的。
当启动了另一个activity新的activity就会到栈顶然后运行。
上一个activity 仍然留在栈里。
当用户按返回Back键时当前activity就被弹出栈上一个activity继续运行。
栈里保存着很多的对象。
如果一个任务有很多个activity实例例如多个地图浏览器那么栈会给每一个实例分配单独的入口栈里的activity实例永远不会重新分配只会被弹进弹出。
一个任务是整个activity的堆栈不是指一个类或者manifest文件中的一个元 素。
所以不可能单独的设置栈里的某一个activity的值。
事实上软任务的值是主activity里设定的。
例如我们以后会提到的“任务的 affinity”。
从affinity读取的值可以设置到任务的主activity中。
任务里的所有activity被看做一个整体。
这个整理可以被拿到前台或者放在后台运行。
假设当前任务有四个activity一个正在运行的和三个在堆栈里的。
用户按下HOME键后会转到程序触发器里让用户选择一个新的应用程序实际上 是一个新的任务。
当前任务转到后台新任务的主activity开始运行。
一段时间后用户又回到HOME屏选择启动刚才隐藏的任务隐藏的任务中四个 activity都会转到前台。
当用户按下BACK键时屏幕不会显示刚刚离开的activity上一个任务的主activity而会显示当前任务 中当前栈中的上一个activity。
即不会在任务间返回只会在activity间返回。
上面只是说了activity和任务的默认的行为其实可以修改他们几乎所有的方面。
activity和任务的联系、任务里activity的行为、被Intent对象的标记和ltactivitygt里的元素影响着无论是请求者还是回应者都有一定决定权。
主要的Intent标记如下 FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_RESET_TASK_IF_NEEDED FLAG_ACTIVITY_SINGLE_TOP 主要的 ltactivitygt属性如下 taskAffinity launchMode allowTaskReparenting clearTaskOnLaunch alwaysRetainTaskState finishOnTaskLaunch 接下来会介绍这些标记和属性的作用之间的相互影响和使用它们时的应考虑到的问题。
Affinities 亲和力 and new tasks Affinities 和新任务 这段很别扭 默认情况下一个程序里的各个activity之间都有联系他们共属于同一个任务 task然而通过taskAffinity的ltactivitygt属性可以给每个activity设置个人的Affinities 。
定义在不同应用程序里的activity可以共享自己的affinities定义在相同的程序里的activity也可以声明不同的 affinities。
affinity 在两种情况下起作用一种是当通过Intent启动的activity中包含有FLAG_ACTIVITY_NEW_TASK标记时一种是 activity的allowTaskReparenting属性被设置成true时。
FLAG_ACTIVITY_NEW_TASK 标记 如前所述被其他activity通过startActivity方法启动的 activity他和启动他的前一个activity属于同一个堆栈。
然而如果传递的Intent对象中被设置了 FLAG_ACTIVITY_NEW_TASK标记那么系统会在一个新的任务里启动activity。
通常启动的activity就像名字那样是一 个新的任务。
然后那不是必须的如果已经存在了和要启动的activity相同affinity的任务已存在的任务会被运行如果不存在才会重启一个 新的任务。
allowTask.
上一篇:
Android深入浅出之AudioPolicy
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计