当前位置:文档之家› 第二章_Android基础知识

第二章_Android基础知识

第二章_Android基础知识
第二章_Android基础知识

第二章Android基础知识

2.1 Android是什么?

(Simon翻译自http://developer。android。com/guide/basics/what-is-android.html)

Android是一个面向移动设备的软件堆层(software stack),包含了一个操作系统,中间件和关键的应用程序。Android SDK提供了必要的工具和API,你可以在这些的基础上使用java编程语言开发Android平台上的应用程序。

特性

●应用程序框架支持组件的复用和更换

●Dalvik虚拟机专门为移动设备进行过优化

●集成的浏览器基于开源的WebKit引擎

●优化的图形机制自定义的2D图形库,基于OpenGL ES 1。0规范的3D 图形实现(本

项硬件加速器可选

●SQLite 轻量级的数据库,支持结构化数据的存储

●媒体支持面向常见的音频、视频以及静态图形档案格式(MPEG4, H。264,

MP3,AAC,AMR,JPG,PNG,GIF)

●GSM技术(依赖硬件支持)

●Bluetooth,EDGE,3G,和WiFi (依赖硬件支持)

●Camera,GPS,compass,和accelerometer (依赖硬件支持)

●丰富的开发环境包含一套硬件仿真器,一些用于程序调试、内存和性能剖析的

工具,以及支持Eclipse集成开发环境的插件(ADT)。

Android框架

下图表显示了Android操作系统的主要组件。下面会对每个部分进行更详细的描述。

应用

Android将预装一组核心应用程序,包括email客户端、短信服务、日历日程、地图服务、浏览器、联系人和其他应用程序。所有应用程序都是Java编程语言编写的。

应用框架

通过提供一个开放的开发平台,开发者使用Android可以开发出极为丰富且新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等。

开发者拥有对核心应用程序所使用的相同框架API的完全访问权力。应用程序框架的设计旨在简化组件的复用;所有应用程序都可以发布其能力。任何应用程序都可以发布自己的功能,然后其他任何应用程序都可以使用这些功能(需要符合框架强制要求的安全约束)。这一相同的机制允许用户替换组件。

所有应用都是一组系统和服务,一般包含:

●一组丰富和可扩展的,可以用来构建应用程序的视图组件,含有lists,grids,text

boxes,buttons,甚至内嵌网络浏览器

●Content Providers(内容提供器)使一个应用程序可以访问另外一个应用程序的数据(如

联系人),或者应用程序内部共享自有数据

●Resource Manager(资源管理器),提供对本地化字符串、图形和布局文件等非代码

资源的访问通道

●Notification Manager(通知管理器),使所有的应用程序在状态栏显示自定义的警告

通知

●Activity Manager(活动管理器)负责管理应用程序的生命周期,提供通用导航回退

更多应用程序细节,请参考"记事本教程"。

Android包含一组各种各样的Android系统组件都在使用的C/C++库。这些功能通过Android 应用程序框架提供给开发者。下面列举一些核心库:

●系统C库——基于BSD的标准C系统库(libc)实现,移植到了Linux嵌入式设备上●媒体库——基于PacketVideo的OpenCORE;媒体库支持很多流行音频和视频格式、静

态图形文件(包括MPEG4,H。264,MP3,AAC,AMR,JPG和PNG)的播放和录制

●表面管理器——管理对显示子系统访问,无缝组合多个应用程序的二维和三维图形层●LibWebCore——是流行的浏览器引擎,可以支持Android浏览器和嵌入式的网页视图●SGL——底层的2D图形引擎

●3D库——基于OpenGL ES 1。0 API的实现;该类库使用硬件3D加速器(有相应硬件

时)或者内置的、高度优化的3D软件加速机制。

●FreeType——支持位图和矢量字体渲染

●SQLite——面向所有应用的,强大且轻量级的关系型数据库引擎

Android运行时刻(Android Runtime)

Android的核心类库提供Java类库所提供的绝大部分功能。

每个Android应用程序都通过Dalvik虚拟机在自己的进程中运行。Dalvik被设计来使一台设备有效地运行多个虚拟机。Dalvik虚拟机执行的是Dalvik格式的可执行文件(。dex)——该格式经过优化,以降低内存耗用到最低。虚拟机是基于寄存器,运行Java编译器编译的类,这些类通过Android内置的“dx”工具编译成了。dex格式。

在一些底层功能,比如线程和低内存管理方面,Dalvik虚拟机是依赖Linux内核的。Linux内核

Android在安全、内存管理、进程管理、网络组、驱动模型等核心系统服务上依赖Linux 2.6版。内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层。

2.2 Android应用程序基础

(Simon翻译自https://www.doczj.com/doc/ff18664511.html,/guide/topics/fundamentals.html)

Android应用程序是用java语言写的,通过aapt工具把编译好的java代码和应用程序所需要的所有数据、资源文件打包成Android包,即后缀为.apk的压缩文件,这个文件是发布应用程序和在移动设备上安装应用程序的媒介,是用户下载到他们设备上的文件。一个.apk 文件中的所有代码同属于一个应用程序。

从很多方面来说,每个android应用程序都运行在自己的空间里:

●默认每个应用程序在自己的Linux进程中运行,当应用程序中的任何代码需要执行时

android就启动一个的进程,当不再需要或系统资源被其他应用程序请求时android就关闭这个进程。

●每个进程都有其专属的Java虚拟机(VM),所以应用程序代码运行时与其他的应用程

序是彼此隔离的。

●默认的,每个应用被赋予一个唯一的Linux用户ID,由于权限设置的原因,一个应用

程序的文件只有本用户(应用程序本身)可见——当然,也有把他们导出给其他应用程序的机制。

可以为两个应用程序安排使用同一个用户ID,这种情况下他们彼此之间是可以看见对方的文件。为了节约系统资源,拥有相同ID的应用也能被安排运行在一个相同的Linux进程中,共享同一个虚拟机。

应用程序组件(Application Components)

Android一个核心特点就是一个应用程序能使用另一个应用程序的元素(在提供元素的应用程序允许的情况下)。例如,如果你的应用程序想要显示一个滑动图片列表,另一个应用程序正巧开发了合适的滑动模块,并且同意共享,你就可以调用那个滑屏模块处理这些图片并显示出来,而不是自己再去开发一个。你的应用程序并没有包含或链接了提供元素的应用程序的代码,只是在需要的时候启动使用其他程序的部分功能。

为了实现这样的过程,系统必须在应用程序的任何部分被请求时启动这个程序的进程,实例化那部分Java对象。因此,和其他大多数系统不同的是,android应用程序没有一个单独的程序入口(例如:没有main函数)。而是包含运行所需的必要组件,使得系统可以实例化对象。android中有四种组件:

活动( Activity)

一个Activity表示用户可视化界面,用户可以在上面进行一些操作。例如,活动会显示一个用户可选的菜单项的列表,或是显示带有标题的图片。一个文本信息应用程序可能有一个活动来显示将要发送信息的联系人对象,一个活动用于显示撰写信息文本给

选定的联系人,其它的活动用于查看旧的消息或者显示设置的界面。虽然它们作为一个整体的用户界面进行协同工作,但是每一个活动都是相对独立的。每一个活动都是活动基类(类Activity)的一个子类实现。

一个Android应用可能由一个活动组成,或者像上面提到的文本信息应用程序一样包含了多个活动。活动是什么样的以及需要多少的活动,这些取决于你的应用程序是如何设计的。最典型的是将一个活动被标记为第一个,当应用被加载时显示给用户。从一个活动转到另一个活动是通过在当前活动来运行下一个活动实现的。

每个活动提供了一个用于绘制的默认窗口。通常窗口将占满整个屏幕,但是也有可能比屏幕小并且浮在另一个窗口的上面。一个活动可以使用多个窗口——例如,在活动中央显示一个需要用户回应的弹出对话框,或者当用户选择屏幕上一个特定项目时为用户显示一些重要信息的窗口。

窗口中的可见的内容是由一组继承自View基类的view组成的层次体系。每个view控制窗口中一块特定的矩形区域,父view包含并组织子view的布局。叶view(层次底端的view)绘制它们管理的矩形,并且负责响应用户在此区域的操作,因此view就是活动和用户交互的地方。例如,一个view显示一个小图片,当用户点击这个图片后开始一个操作。Android有很多已经做好的view你可以选择使用,包括按钮,文本输入框,滚动条,菜单项,多选列表等等。

通过使用Activity.setContentView()方法将一组view层放置到一个活动窗口中,content view是view层中最顶端的那个view。(参见User Interface的文档获取更多有关view 和层次的信息。)

服务(Services)

服务没有可见的用户界面,但是可以在后台运行任意长的时间。例如,一个服务可以在用户转向其他工作后仍然在后台播放音乐,或者从网上下载数据,或者计算一些东西然后在需要的时候提供给活动。每个服务都继承自Service基类。

一个主要的例子就是从列表中播放音乐的媒体播放器。播放器程序可能会有一个或几个活动,这些活动可以让用户选择希望播放的音乐然后显示播放。但是音乐播放过程本身不会使用一个活动,因为用户希望在切出播放器界面做别的事情时音乐也能一直放下去。为了保持播放继续,播放器的活动可以启动一个在后台运行的服务。然后即使启动这个服务的活动退出,音乐播放服务也能继续运行。

你可以连接(connect)或者绑定(bind)到一个正在运行的服务(如果这个服务还没运行的话就启动它)。当连接到服务后,你可以通过服务暴露出来的接口和这个服务进行通信,对音乐播放服务来说,这个接口可能允许用户暂停,后退,停止,重新播放等操作。

像活动和其他组件一样,服务运行在这个应用程序进程的主线程中。因此为了不阻塞其他的组件或者用户界面,服务经常为那些耗时长的任务单独开一个线程(比如音乐播放)。

广播接收器(Broadcast receivers)

广播接收器只是接收广播并对广播信息做出作出反应,多数的广播是由系统代码发出的——-比如反应时区变化的通知,电量低的通知,照了一张照片的通知,或者用户修改了系统语言的通知。应用程序也可以自己定义广播,比如定义这样一个广播,让其他的应用程序知道某些数据已经下载完毕了可以使用了。

应用程序可以有任意数量的广播接收器来对他所关心的广播进行监听并作出反应。所有的广播接收器都继承自BroadcastReceiver基类。

广播接收器不显示在用户界面上,但是可以启动一个活动来对接收到的信息进行响应,或者可以使用BroadcastReceiver来警告用户。Notifications(通知)可以通过不同的方式引起用户的注意,比如使背景灯闪烁,使设备振动,播放声音等等。通常是在状态栏上显示一个不会消失的图标,用户可以打开这个图标查看通知。

内容提供者(Content providers)

内容提供者使程序中特定的数据可以被其他程序使用。这些数据可以存储在文件系统中,SQLite数据库中,或者任何其他可以存数据的地方。内容提供者继承自ContentProvider 基类,实现了一系列的使其他程序获取和存储其支持的数据格式的方法,但是应用程序不直接调用这些方法。而是使用一个ContentResolver对象,然后调用这个对象的方法。ContentResolver可以和任何的内容提供者交流,它和提供者协作来管理所有涉及到的进程间的通信。

获取更多使用内容提供者的详细信息请参见另一篇文档——Content Providers。

无论何时请求都应该由一个特定的组件来处理,Android将确认组件的应用程序进程是否处于运行状态,并在需要的时候启动它,以及组件的一个特定实例是否可得,并在需要的时候生成该实例。

激活组件:intent

当有一个来自于content resolver的请求指向内容提供者时,内容提供者被激活。其他的三个组件——活动,服务,广播接收器——是通过一个叫做intent的异步的消息来激活的,intent持有异步消息的内容。对于活动和服务,它主要是为被请求的动作命名,然后指定需要操作的数据的URI。例如,它可能携带让一个活动为用户展现一张图片或者让用户编辑文本的请求。对于广播接收器,intent对象为将要广播的内容命名。例如,它可能会通知感兴趣的一方相机的按钮被按下了。

激活不同的组件需要使用不同的方法:

活动(或者新的任务)是通过传递一个Intent对象到Context.startActivity()或者Activity.startActivityForResult()来。被激活的活动可以通过getIntent()方法来查看使它启动的原始intent。Android调用Activity.onNewIntent()方法来传递之后的intent。

一个活动常常会启动下一个活动。如果前一个活动希望下一个启动的活动返回一个结果,那么它将调用startActivityForResult()而不是startActivity()。例如,如果一个老活动开启了一个让用户选择照片的新活动,它可能期待返回选中的照片。结果通过传递给

被调用的活动的onActivityResult()方法的Intent对象返回。

●服务是通过传递Intent对象到Context.startService()来启动的(或者将新的命令指派给正

在运行的service),android调用service的onStart()方法,并且把Intent对象传递给他。

类似的,一个Intent可以被传递到Context.bindService()方法里来建立呼叫组件与被叫目标服务的实时连接,调用service的onBind()方法来接收这个Intent对象。(如果这个service还没有运行,可以选择使用bindservice()启动它)。例如,一个activity可以建立一个与前面提及的音乐播放服务的连接,这样它就能够提供控制播放的方式给用户(一个用户界面)。activity将调用bindService()来建立该连接,然后调用该service定义的方法来进行播放。

后面讲到Remote procedure calls,有更详细的绑定服务的信息。

●初始化broadcast可以通过传递一个Intent对象给诸如Context.sendBroadcast()、

Context.sendOrderedBroadcast()和Context.sendStickyBroadcast()方法。Android通过调用它们的onReceive()方法,将intent传递给所有感兴趣的broadcast receiver。

想要了解更多的intent信息,参照另一篇文档,Intents and Intent Filters。

关闭组件(Shutting down components)

一个content provider仅仅在它响应从ContentResolver来的请求时处于活跃状态。一个broadcast receiver仅仅在它响应broadcast信息时处于活跃状态。所以没必要显示地关闭这些组件。

另一方面,Activity提供用户界面。它们会与用户长时间地对话,而且可能在整个对话过程中,即使处于空闲状态,都保持活跃状态。同样的,service也可能长时间保持运行状态,所以Android提供了下列关闭activity和service的方法:

●Activity可以通过调用它自己的finish()方法来关闭。一个Activity也可以通过调用

finishActivity()来关闭另一个Activity(只能是由它通过调用startActivityForResult()启动的)。

●一个service可以通过调用自己的stopSelf()方法,或者Context.stopService()方法来结

束。

当组件不再使用时或者android为了别的更活跃的组件能运行而回收内存时,android系统会关闭这些组件,在后面介绍组件生命周期的部分会有更多详细的介绍。

manifest文件(The manifest file)

在Android启动一个应用程序组件之前,它必须知道该组件确实存在。因此,应用程序在manifest文件中声明了他的全部组件。manifest文件随同应用程序的代码、文件、资源一同

打包在了Android包中,即.apk文件中。

manifest是一个结构化的XML格式文件,对所有应用程序它都是命名为AndroidManifest.xml。除声明应用程序组件之外,它还做一些别的事情,例如为所有应用程序需要进行连接的库命名(除默认Android库)以及识别所有应用程序期望获得的权限。

但是manifest的主要任务还是为Android提供应用程序组件的的信息。例如,一个activity

元素的name属性指定实现了activity的Activity子类。icon和label属性指向包括一个图标和标签的资源文件,这些资源文件可以在activity被显示时显示给用户。

其他的组件也以同样的方式声明——声明service使用元素,broadcast receiver使用元素,content provider则使用元素。系统将无法看到没有声明在manifest里的activity,service以及content provider,当然也就永远无法运行它们。但是broadcast receiver既可以声明在manifest里,也可以在代码里动态创建(如创建Broadcast Receiver对象),然后通过调用Context.registerReceiver()注册到系统里。

更多关于构建应用程序的manifest文件的信息,请参照The AndroidManifest.xml File Intent过滤器(Intent filters)

Intent对象能够明确的指定一个目标组件。如果它指定了,Android将找到那个组件(根据manifest文件里的声明)并激活它。但是如果目标没有被明确的被指定,Android就必须找到最佳的组件来响应intent。Android将Intent对象与intent filter中可能的目标组件相比较来找出最佳的组件。组件的intent filter通知Android该组件所能够使用的intent的种类。和其他关于组件的必要的信息一样,它们也在manifest文件里声明。这里扩展了前面的例子,将两个intent filter加到activity里去:

例子中的第一个filter的动作action.MAIN和目录https://www.doczj.com/doc/ff18664511.html,UNCHER组合是很常见一种。它标识这个activity要在应用程序启动器屏幕中被列出,就是可以列出设备上用户可用的的应用程序的那个屏幕。换句话说,该activity是应用程序的入口点,是用户在应用程序启动器上选择该应用程序时所看到的初始的activity。

第二个filter声明一个action,使得该activity能够处理一种特定类型的数据。

一个组件可以有任意数量的intent filter,每一个声明这个组件的一种能力。如果一个组件不含任何filter,它只能够被明确指定作为目标组件的intent激活。

对于在代码里生成和注册的broadcast receiver,intent filter将作为IntentFilter对象直接实例化。所有其他filter都是在manifest中创建。

更多intent filter相关内容,请参照另外的文档Intents and Intent Filters。

活动和任务(Activities and Tasks)

上文提到,一个Activity可以启动另一个Activity,即使这个Activity是定义在另一个应用程序里的,比如说,你想展示给用户一条街的地图,现在已经有一个Activity可以做这件事,那么现在你的Activity需要做的就是将请求信息放进一个Intent对象里,并且将这个Intent 对象传递给startActivity(),地图就可以显示出来了,但用户按下BACK键之后,你的Activity又重新出现在屏幕上。

对用户来说,显示地图的Activity和你的Activity好像在一个应用程序中的,虽然是他们是定义在其他的应用程序中并且运行在那个应用进程中。android将你的Activity和借用的那个Activity放进一个task里,以维持用户体验。简单来讲,task就是用户觉得好像是一个"应用程序"的东西。task是以栈的形式组织起来的一组相互关联的Activity,,栈中底部的Activity就是开辟这个task的,通常是用户在应用程序启动器中选择的Activity。,栈顶部的Activity是当前正在运行的Activity——用户正在交互操作的Activity。当一个Activity启动另一个Activity时,新启动的Activity被压进栈中,成为正在运行的Activity。旧的Activity仍然在栈中。当用户按下BACK键后,正在运行的Activity弹出栈,旧的Activity 恢复成为运行的Activity。

栈中包含对象,因此如果一个任务中开启了同一个Activity子类的多个对象——例如,多个地图浏览器——则栈对每一个实例都有一个单独的入口。栈中的Activity不会被重新排序,只会被压入、弹出。

task是一组Activity实例组成的栈,不是在manifest文件里的某个类或者元素,所以无法设定一个task的属性而不管它的Activity,一个task的所有属性值是在底部的Activity里设置的。例如,下一节会讲到"任务的affinity",affinity信息就是从底部Activity中获取的。

一个task里的所有Activity作为一个整体运转。整个task(整个Activity堆栈)可以被送到前台或者被推到后台。假设一个正在运行的task中有四个Activity——正在运行的Activity 下面有三个Activity,这时用户按下HOME键,回到应用程序启动器然后运行新的应用程序(实际上是一个新的task),那么当前的task就退到后台,新开启的应用程序的root Activity此时就显示出来了;一段时间后,用户又回到应用程序启动器,又重新选择了之前的那个应用程序(先前的那个task),那么先前的那个task此时又回到了前台了,当用户按下BACK键时,屏幕不是显示刚刚离开的新开启的那个应用程序的Activity,而是移除回到前台的这个task的栈顶Activity,将这个task的下一个Activity显示出来。

以上描述的情况是Activity和task默认的行为,但是那个行为的几乎所有方面都是可以修改的。Activity和task的关系,以及task中Activity的行为,是受启动该Activity的Intent对象的标识和在manifest文件中的Activity的元素的属性共同影响的。

在这种情况下,主要的Intent控制标识有:

稍后会描述这些标识和属性做什么,它们之间如何相互作用,使用它们时应该注意什么。affinity和新的tasks(Affinities and new tasks)

默认的,一个应用程序中的所有Activity都有血缘关系——就是都属于同一个task的。但是,可以通过元素下的taskAffinity属性来为某个Activity设置单独的affinity。定义在不同应用程序中的Activity可以共享一种affinity,或者一个应用中的不同的Activity可以定义不同的affinity。affinity满足以下两种情况时起作用:一是当启动Activity的Intent对象包含有FLAG_ACTIVITY_NEW_TASK标志时,二是当Activity的allowTaskReparenting属性设置为“true”。

FLAG_ACTIVITY_NEW_TASK标志位

如前面提到的,默认情况下,Activity调用startActivity()启动一个新的Activity时,新的Activity会压入到相同的task中,但是如果传递给startactivity()的Intent对象含有

FLAG_ACTIVITY_NEW_TASK标志,系统就会寻找一个新的task来装这个新的Activity。通常就如控制标识的字面的意思一样,它是一个新的task。然而并不是一定要那样,如果已经有一个task和这个新的的Activity有相同的affinity,那么就把这个新的Activity放进那个task里,如果没有,就启动一个新的task。

allowTaskReparenting属性

如果一个Activity的allowTaskReparenting属性设置为true,这个Activity就可以从启动时的那个task移动到一个和它有相同affinity的前台的一个task里去,比如,假设现在有一个用于天气预报的Activity被定义在一个旅行的应用程序里,他和这个应用里的其他Activity有相同的affinity(默认的affinity),并且允许重定父级。现在你自己的应用程序中有一个Activity启动这个天气预报的Activity,那么天气预报Activity就会移动到你的Activity所在的task里,当旅行的应用程序回到前台时,天气预报Activity重新回到以前的那个task并显示。(译者注:如果说没有设置这个属性,或者这个属性设置为false,那么一个应用里的Activity调用另一个应用里的Activity时,系统是为另一个应用里的Activity创建一个实例,然后放到同一个task里,但是如果设置了allowTaskReparenting为true,那么另一个应用里的Activity是可以在不同的task间来回移动的,那个task在前台就移动到那个task里)

如果从用户的角度来看,一个.apk文件里包含不止一个"应用程序"的话,你将可能会给每个activity指定不同的affinity来关联它们。

启动模式(Launch modes)

这些模式有以下四点不同:

●响应Intent时Activity将被装入哪个task。对于standard和singleTop模式,由产生该

Intent(调用startActivity())的task持有该Activity——除非Intent对象里含有FLAG_ACTIVITY_NEW_TASK标志,那么就像前面章节讲的那样的寻找一个新的task。

相反的,singTask和singleInstance模式,总是标志Activity为task的root Activity,开启这样的活动会新建一个task,而不是装入某个正在运行的任务。

●一个Activity是否可以有多个实例。一个standard或者singleTop属性的Activity可以实

例化多次,他们可以属于多个不同的task,而且一个task也可以含有相同Activity的多个实例。

相反的,singleTask或者singleInstance属性的Activity只能有一个实例(单例),因为

这些Activity是位于task的底部,这种限制意味着同一设备的同一时刻该task只能有一个实例。

●实例是否能允许在它的task里有其他的Activity。一个singleInstance属性的Activity

是它所在的task里仅有的一个Activity,如果他启动了另一个Activity,那个Activity 会被加载进一个不同的task而无视它的启动模式——就如Intent里有FLAG_ACTIVITY_NEW_TASK标识一样。在其他的方面,singleInstance和singleTask 一样的。

其他三个模式允许有多个Activity在一个task里,一个singleTask属性的Activity总是一个task里的root Activity,但是他可以启动另外的Activity并且将这个新的Activity 装进同一个task里,standard和singleTop属性的Activity可以出现在task的任何位置。

●是否创建一个新的Activity实例来处理一个新的Intent。对于默认的standard方式,将

会生成新的实例来处理每一个新的Intent。每个实例处理一个新的Intent。对singleTop 模式,如果一个已经存在的实例在目标task的栈顶,那么就重用这个实例来处理这个新的Intent,如果这个实例存在但是不在栈顶,那就不重用他,而是重新创建一个实例来处理这个新的Intent并且将这个实例压入栈。

例如现在有一个task堆栈ABCD,A是root Activity,D是栈顶Activity,现在有一个启动D的Intent来了,如果D是默认的standard方法,那么就会创建一个新的实例来处理这个Intent,所以这个堆栈就变为ABCDD,然而如果D是singleTop方式,这个已经存在的栈顶的D就会来处理这个Intent,所以堆栈还是ABCD。

如果另外一种情况,到来的Intent是给B的,不管B是standard还是singleTop(因为现在B不在栈顶),都会创建一个新的实例,所以堆栈变为ABCDB。

如上所述,一个"singleTask"或"singleInstance"模式的activity只会有一个实例,这样它们的实例就会处理所有的新intent。一个"singleInstance" activity总是在栈里的最上面(因为它是task里的唯一的activity),这样它总是可以处理一个intent。而一个"singleTask" activity在栈里可以有或没有其他activity在它上面。如果有的话,它就不能对新到的intent进行处理,intent将被丢弃。(即使intent被丢弃,它的到来将使task 来到前台,并维持在那里。)

当一个已有的Activity被请求去处理一个新的Intent时,Intent对象会通过onNewIntent()的调用传递给这个活动。(传递进来的原始的Intent对象可以通过调用getIntent()获取)。

注意,当创建一个新的Activity的实例来处理一个新收到的Intent时,用户可以按BACK键回到上一个状态(上一个Activity)。但是使用一个已有的Activity实例操作新收到的Intent 时,用户不能通过按下BACK键回到这个实例在接受到新Intent之前的状态。

启动模式的更多信息,参见清单文件元素的描述。

清理堆栈(Clearing the stack)

当用户长时间没有使用一个运行着的task,系统就会清理掉task里除了root Activity以外的所有的Activity,当用户再次使用这个task时,显示的是root Activity。之所以这样做是认为,用户长时间不使用这个task,就很可能是希望放弃他们之前的操作,再次回到这个task就要重新开始。

上面说的是默认的情况,有一些Activity的属性可以用来控制和修改这些行为:

alwaysRetainTaskState属性

如果一个task里的root Activity的alwaysRetainTaskState属性设置为true,那么前面描述的默认情况就不会出现了,无论用户多长时间没有使用task,task也会一直保留栈中所有的Activity。

clearTaskOnLaunch属性

如果一个task里的root Activity的clearTaskOnLaunch属性设置为true,和alwaysRetainTaskState相反,即使是一瞬间的离开,系统马上就会清理掉task里除root Activity以外的所有Activity,task变回初始的状态。

finishOnTaskLaunch属性

这个属性和clearTaskOnLaunch一样,但是他是对一个Activity起作用,不是整个task,他能引起所有的Activity离开,包括root Activity,当这个属性设置为true,只是当用户使用这个应用程序时Activity才在task里,一旦用户离开该task后重新回来,该Activity不再存在。

还有一种方法来从task里强制移除Activity,如果一个Intent对象里包含FLAG_ACTIVITY_CLEAR_TOP标志,并且目标task里已经有一个可以处理此Intent的Activity实例,那么在栈中这个Activity之上的所有Activity将被清除,这时这个Activity就位于栈顶,可以响应该Intent。如果此Activity的启动模式是"standard",那么这个Activity 本身也会被移除出栈,建立新的Activity实例来处理这个Intent。这是因为如果启动模式是"standard",那么每一个Intent都会用一个新的实例进行处理。

FLAG_ACTIVITY_CLEAR_TOP通常会和FLAG_ACTIVITY_NEW_TASK一起使用。同时使用时,这个组合是找到另一个task中的已有Activity然后将它转入新的task中以响应一个Intent的一种方法。

启动任务(Starting tasks)

可以通过将activity的intent filter的action指定为“android.intent.action.MAIN”,以及类别(category)指定为“https://www.doczj.com/doc/ff18664511.html,UNCHER”,可以将它设置为task的入口activity。(关于这种类型的filter,在上面的章节的Intent Filters里有一个例子)。一个该类型的filter 使该activity的图标和标签显示在应用程序启动器(launcher)上,这样就提供给用户一个方法,既可以加载该task,又可以在它被加载后随时回到它。

第二个功能很重要:用户必须能够在离开一个task后回到这个task。“singleTask”和“singleInstance”这两种启动模式的activity总是启动一个task,所以只有当activiay有MAIN 和LAUNCHER filter的时候才使用。设想,如果在没有这两个filter的activity中使用将会发生什么:一个Intent激活了一个"singleTask"的activity,创建了一个新的task,用户在这个task中做了一些操作,然后用户按下HOME键。这个activity就退到后台,但是由于这个activity不在应用程序启动器(launcher)中显示,用户无法再回到那个activity中了。

相似的难题在使用FLAG_ACTIVITY_NEW_TASK控制标识时也会出现。如果该标识使一个activity开始了一个新的task,然后用户按了HOME键离开这个activity,也没有办法再回来了。一些东西(例如通知管理器)总是在一个新的task里打开activity,而从来不在自己的task中打开,所以它们总是将包含FLAG_ACTIVITY_NEW_TASK的Intent传递给startActivity()。所以如果你有一个可以被其他的东西以这个控制标志调用的activity,请注意用户有独立的回到这个activity的方法。

如果你希望用户离开activity之后就不能回到这个activity,可以将元素的finishOnTaskLaunch的值设为"true"。参照之前的Clearing the stack。

进程和线程(Processes and Threads)

当应用程序第一个组件需要运行时,android系统就为这个组件分配一个Linux进程,这个进程只有一个运行线程。默认这个应用程序所有组件都运行这个进程中的这个线程中。

但是你可以将一些组件运行在其他进程中,并且你可以为任意的进程添加线程。

进程

组件运行在哪个进程中是在manifest文件里设置的,四大组件————都有一个process属性来指定组件运行在哪个进程中。你可以通过设置这个属性,使得每个组件运行在它们自己的进程中,或者几个组件共享一个进程,或者不共享。你甚至可以设定位于不同的应用程序中的组件运行在同一个进程中——这两个不同的应用程序需要由同一作者签名,并且分享同一个linux用户ID,元素也有一个process属性,用来指定所有组件的默认属性。

所有的组件都在指定的进程中的主线程中实例化的,对组件的系统调用也是由主线程发出的。每个实例不会建立新的线程。对系统调用进行响应的方法——比如负责报告用户动作的View.onKeyDown()和后面讨论的组件生命周期通知函数——都是运行在这个主线程中的。这意味着当系统调用这个组件时,这个组件不能长时间的阻塞线程(比如说网络操作,循环计算),因为这样会阻塞这个进程中其他组件,你可以将很耗时的任务分到其他的线程中。

当内存不足并且有其他更紧急的进程请求时,Android系统可能结束一个进程,运行在这个进程中的组件会被销毁,当用户重新打开这个应用程序时时,系统会重新启动这个进程。

Android权衡进程的重要性来决定结束哪个进程。例如,一个在后台的进程比正在显示的进程更容易被结束。是否要结束某个进程是由里面运行的组件的状态决定的。组件的状态在下一章节,组件生命周期中讨论。

线程

即使你限制了你的应用程序运行在一个进程中,但是有的时候你可能需要新开一个线程在后台运行。因为用户界面需要随时对用户的动作做出反应,所以一些很耗时的工作应该重新启动一个线程来做,以免阻塞主进程。

线程在代码中使用标准的java Thread对象来建立,Android系统提供了一系列方便的类来管理线程——Looper用来在一个线程执行消息循环,Handler处理消息,HandlerThread 创建带有消息循环的线程。

远程调用(Remote procedure calls)

Android系统有一个轻量级的远程调用机制(RPCs)——使方法在本地调用,在远程执行(在另外一个进程里),并将所有结果返回本地。这需要将方法的调用和随之的数据解释成操作系统可以识别的级别,将数据从本地进程和地址空间传递到远程的进程和地址空间,并在远端重新装配和组织。返回数据的时候传输方向相反,android系统会去做这些传输的工作,让你能够集中精力来定义和实现你的RPC接口。

一个RPC接口可以只包含包含方法,所有的方法都是同步执行的(本地方法会等待远程方法),在没有返回值的情况下也是这样。

简单的说,RPC机制是这样工作的:首先你需要用IDL(接口定义语言)声明你想要实现的RPC接口,然后使用aidl工具来生成该接口的java接口定义,该接口在本地进程和远端进程都是可用的,这个java接口中包含了两个内部类,如下图所示:

这两个内部类管理你用IDL声明的接口的远程调用的所有代码,两个内部类都实现IBinder 接口,一个是在系统在本地内部使用,你自己写的代码可以忽略它。另外一个叫做Stub,继承自Binder类。除了包含执行IPC调用的代码,还包含你在声明的RPC接口中的方法的声明,你应该继续继承Stub类来实现这些方法,就像图中所示。

一般的,远端进程应该由service来管理(因为service能够将进程以及它与其他进程间的连接相关情况通知给系统)。这样的service既有aidl工具生成的接口文件,又包含了RPC方法的实现的Stub的子类。service的客户端将只有aidl工具生成的接口文件。

以下是service如何和它的客户端建立连接:

●Service的客户端(在本地)将实现onServiceConnected()和onServiceDisconnected()方法,

这样当一个到远程service连接建立或断开的时候,客户端可以得到这一消息。然后客户端将调用bindService()方法来设置这个连接。

●根据接收到的Intent(传递给bindService()的intent),service的onBind()方法将被用于实

现接受或者拒绝连接。如果连接被接受,该方法返回一个Stub子类的实例。

●如果该service接受了该连接,Android调用客户端的onServiceConnected()方法并传递

给它一个IBinder对象,IBinder对象是由service管理的Stub子类的代理。通过该代理,客户端能够调用远程service。

这个简要的RPC机制介绍省略了一些细节。更多的信息请参照Designing a Remote Interface Using AIDL和IBinder类的介绍。

线程安全方法(Thread-safe methods)

在某些时候,你实现的方法可被不止一个线程调用,因此你的实现必须是线程安全的。

这种情况主要出现在被远程调用的方法中——比如在前面讨论的RPC机制。当一个实现了IBinder对象方法的调用发生在该IBinder相同的进程里,方法在调用方的线程里执行。但是当调用来自另外的进程时,方法将运行在Android为IBinder进程维护的线程池里选择的一个线程中,而不会运行在另外那个进程的主线程中。例如,尽管一个service的onBind()方法的调用来自service进程的主线程,onBind()返回的对象的实现的方法(比如一个实现了RPC方法Stub子类)会被在线程池中的线程调用。因为service可以有很多客户端,因此在同一时间可能有多个线程池中的线程调用了IBinder方法。因此IBinder方法必须被实现成线程安全的。

类似的,一个content provider能够接收来自其他进程的数据请求。尽管ContentResolver和ContentProvider类隐藏了管理内部进程间通信的细节,可是响应这些请求的ContentProvider 方法—query(),insert(),delete(),update()和getType()方法—是从content provider进程的线程池中调用的,而不是从该进程的主线程。因为这些方法在同一时刻可能被任意数量的线程调用,所以它们也必须被实装为线程安全的。

组件生命周期(Component Lifecycles)

程序组件有生命周期——从开始Android实例化它们以响应intent到实例被销毁时结束。在这段时间,组件有时候是激活状态,有时候是不活跃状态,对于activity组件而言,就是用户用户时而可见时而不可见。本节讨论activity,service以及broadcast receiver的生命周期——包括它们存在时可能处于的状态,状态转换时通知的方式,和那些状态对掌管它们的进程的影响。

活动的生命周期(Activity lifecycle)

Activity基本上有三种状态:

●当它在屏幕前端时(处于当前task的activity栈的顶端)状态为激活(active)或正在运行

(running)。该activity是用户动作的焦点。

●如果它失去用户焦点,但是仍然对用户可见,它的状态为暂停(paused)。也就是说,另

一个activity在其上方,并且那个activity是透明的或者未覆盖整个屏幕,因此这个暂停的activity仍然有一部分显示出来。一个暂停的activity依然是活动的(它保存了所有的状态和成员信息并且和窗口管理器连接),但是可以在内存不足时被系统关闭。

●当它被另一个activity完全掩盖时状态为停止(stopped)。这时它仍然保存了所有的状态

和成员信息。然而,它对用户来说不再可见,它的窗口被隐藏,并且在其他地方需要内存的时候常常会被系统kill。

如果一个activity 处于暂停或停止状态,系统可以通过调用finsish()方法或者简单地直接kill 进程来将其从内存中清理掉。当它再次显示给用户时,就必须完全重启并恢复到原来的状态。

当一个activity 转换状态时,系统会通过调用下面受保护(protected)的方法对其进行通知:

所有这些方法都是可以被重载来做状态改变时做适当工作的钩子(hooks)。在对象第一次被实例化的时候,所有的activity 必须执行onCreate()方法来做初始化工作。许多activity 也实现onPause()来确认数据改变并准备好停止和用户交互。

加在一起,这七个方法定义

了一个activity 的完整的生命周期。这儿有三个内嵌循

环,你可以通过实现它们来进行监听: ● activity 的完整生命周期起始于onCreate()的初次调用,结束于单一的onDestroy()调用。activity 通过onCreate()

进行它"global"状态的初步建立,通过onDestroy()释放所有剩余资源。例如,如果它有

一个从网络下载数据的线程运行在后台,它可以通过onCreate()生成那个线程以及通过

onDestroy()停止该线程。

● activity 的可视生命周期从一个onStart()调用开始,直到一个相对的onStop()调用。在此

期间,用户可以在屏幕上看到该activity ,尽管它可能不在前台并与用户交互。在这两

个方法之间,你可以维护需要向用户显示该activity 的所需资源。例如,你可以使用

onStart()注册一个BroadcastReceiver 来监听对你的UI 有影响的变化,以及当用户不再

能够看到你所显示的时候通过onStop()

取消注册。当activity 在用户可视和不可视间交

替的时候,onStart()和onStop()方法能够被多次调用。

● activity 的前台生命周期开始于一个onResume()调用,终止于一个相对的onPause()调用。

在此期间,该activity 位于屏幕上所有其他activity 的前面并与用户交互。一个activity

可以频繁地在重新恢复和暂停状态之间转换—例如,当该设备变成睡眠状态或当开启

一个新的activity 时,onPause()被调用,当一个activity 返回结果或者收到一个新的

intent 时,onResume()被调用。因此,这两个方法里的代码应该相当轻量。

下面的图示说明了这些循环和一个activity 在各个状态间转换的步骤。彩色的椭圆是activity 所处的主要状态。长方形表示当activity 在状态间转换的时候,你可以实现的用来执行操作的回调方法。

下面的表格描述了这些方法的详情,和在整个活动生命周期中的位置:

注意上表中的Killable栏。它标明系统是否可以在该方法返回的任何时候杀死该activity所在进程,而无需执行该activity的其他行代码。三个方法(onPause(),onStop()和onDestroy())标记为"Yes"。因为onPause()是三者的第一个,它是唯一一个允许在进程被杀死前调用的方法,onStop()和onDestroy()可能不被调用。因此,你应该使用onPause()将数据(比如用户编辑)进行永久存储。

Killable栏被标明"No"的方法在被调用的时候能够保护该activity所处进程不会被杀死。例如,从onPause()返回的时刻到onResume()被调用的时刻,一个activity处于可杀死状态。它将不会处于可被杀死状态直到onPause()再次返回。

就如稍后章节Processes and lifecycle将要提到的,技术上来讲,一个activity在这个定义的时候不"可杀",但仍然可能被系统杀死—但也仅仅当已经没有其他资源的极端严重的情况下才会发生。

保存活动状态(Saving activity state)

当系统而不是用户关闭一个activity以节省内存,该用户可能希望返回到该activity的时候,它仍处于之前的状态。

Android开发入门教程经典解析-JAVA语言

Android入门教程之Java核心技术阶段初级课程,从知识分类来说,可以分为三个部分来说明: (一)基础语法: 讲解Java发展史,Java环境搭建,环境变量配置,Java程序的基本结构,java和javac命令的使用,Notepad++工具的使用,语法格式,变量和常量,二进制转换,运算符、表达式,分支结构和循环结构语句,数组与多维数组,冒泡排序,二分查找,随机生成一组不重复的数算法,通过模拟一个双色球案例,把基础语法容融会贯通,打下扎实的基础。 (二)面向对象: 讲解Java中的OOP/OOD/OOA的知识,深入讲解OOP的封装、继承、多态、抽象的概念与实际应用,涉及内容为类与对象的定义和关系,封装分别在Java EE开发和Android开发中的不同,对象的引用传递,对象的内存分配和GC,构造方法和匿名对象,如何开发和定义一个类,深入讲解String类的原代码原理内部实现、特性和内存管理,通过四种字符串连接时的场景分析来深入理解Java编译期和运行期的区别,String的相关操作方法;static 关键字,构造方法私有化,对象数组与动态数组的实现原理,链表数据结构,内部类及优缺点,在EE开发和Android开发的区别和经验;继承的思想,方法重写与重载,super关键字,抽象类、接口和多态的思想,以及真实环境中的应用,Object类,包装类与特性,包与修饰符;课程贯彻的设计模式有:单例模式、工厂模式、策略模式、适配器模式、模板方法模式、代理模式。以及OO设计中的六大原则。通过本节课程你可以彻底理解什么是面向对象编程,加以时日练习,必成大器。 (三)Eclipse与异常处理 异常的基本处理格式和5大关键字的联合使用,Java中异常处理的新特性,自定义异常类,编译时异常与运行时异常的区别,JVM对异常的处理过程,经过前两节课程共两周多的Notepad++写代码,已经达到了纯手写代码的目的,本节课程开始引入了99.9%的程序员都在使用的集成开发环境Eclipse,他对异常调试的强大支持,会让你叹为观止,当然Eclipse 不仅仅只有这些,在这里,你将一一学到。 Android入门教程之Java核心技术阶段中级课程,Java基础、面向对象、Java高级开发,讲解以下内容: (一)常用类库API与算法 讲解StringBuffer类的内部原理,分析原代码实现,与String的区别与应用经验,如何实现国际化程序,日期操作API,Comparable的两种实现,对象克隆,Arrays工具类、Math 工具类、Random类的使用,选择排序算法和二叉树数据结构实现,通过本节课程,你将学到常用类库API和工作中最最常见的排序算法和二叉树,本节过后,你的功力又增强了。 (二)IO与New IO

一看就懂的Android APP开发入门教程

工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择U SE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Andro id的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

Android应用开发基础习题集

任务一 Android开发环境的搭建 第一部分知识回顾与思考 1.Android的四层架构分别包括哪几层分别起到什么作用 答:Linux内核层(Linux Kernel):基于Linux内核,内核为上层系统提供了系统服务。 系统库层(Libraries):系统库基于C/C++语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework):为开发者提供了一系列的Java API,包括图形用户界面组件View、SQLite数据库相关的API、Service组件等。 应用程序层(Applications):包含了Android平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android四层架构中,应用框架层使用的是什么语法( C ) A.C B.C++ C.Java D.Android 2.Android四层架构中,系统库层使用的是什么语法( B ) A.VB B.C /C++ C.Java D.Android 3.应用程序员编写的Android应用程序,主要是调用( B )提供的接口进行实现。 A.应用程序层 B.应用框架层 C.应用视图层 D.系统库层 二、填空题(请在括号内填空) 1.在Android智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android的(应用程序)层。 2.为了让程序员更加方便的运行调试程序,Android提供了(模拟器),可以方便的将程序运行其上,而不要实际的移动终端。 3.为了支持Java程序运行,我们需要安装(JDK)。 三、简答题 1.简述Android开发环境安装的步骤。 答:下载并安装JDK,配置JDK的环境变量; 从Anroid官网上下载Android开发组件(包含Eclipse和Android SDK、ADT); 安装Android开发环境(包括配置Android SDK的环境变量、打开Eclipse通过菜单设定Android SDK 路径)。 2.简述Android应用程序创建和运行的步骤。 答:通过菜单创建Android应用程序,设置应用程序名、Android版本等基本信息。

Android手机分辨率基础知识(DPI_DIP计算)

比如:计算WVGA(800*480)分辨率,3.7英寸的密度DPI

图1 Diagonal pixel 表示对角线的像素值(=),DPI=933/3.7=252 3.手机屏幕的分类 3.1根据手机屏幕密度(DPI)或屏幕尺寸大小分为以下3类,如图2所示 图2 3. 2手机屏幕分类和像素密度的对应关系如表1所示:

图3 从以上的屏幕尺寸分布情况上看,其实手机只要考虑3-4.5寸之间密度为1和1.5的手机4 UI设计 从开发角度讲,应用程序会根据3类A ndroid手机屏幕提供3套UI布局文件,但是相应界面图标也需要提供3套,如表2所示

需要根据物理尺寸的大小准备5套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout- small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间) 2)图片资源方面 需要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi Android有个自动匹配机制去选择对应的布局和图片资源 分享到:?上一篇:分享摩托罗拉milestone手机升级到Android 2.2的过程 ?下一篇:基于feng streaming server 搭建Android直播测试平台 查看评论 7楼pc0de 2011-12-16 17:11发表[回复] 谢谢分享啊 6楼yang_hui198**** ****-11-19 16:44发表[回复] 很强大!!!很喜欢!!! 3楼noICE1 2011-08-16 14:59发表[回复]

Android编程基础笔试题及答案2.0

《Android 编程基础》试卷A 注意事项: 1. 本试卷共8页,满分100分; 2. 请把学院、姓名、班级写到密封线内,考试时间90分钟; 3. 请不要把答案写在密封线内 一、单选题(共35题,共61分) 1、 D03MA057(2分)退出 activity 对一些资源以及状态的操作保存,可以在生命周期的哪个函数中进行 a A 、onPause() B 、onCreate() C 、onResume() D 、onStart() 2、 D02MA058 (2分) Android 项目工程下面的 assets 目录的作用是什么 b A 、放置应用到的图片资源。 Res/drawable B 、主要放置一些文件资源,这些文件会被原封不动打包到 apk 里面 C 、放置字符串,颜色,数组等常量数据 res/values D 、放置一些与 UI 相应的布局文件,都是 xml 文件 res/layout 3、 D04MA059 (2分)下列不属于android 布局的是(c) A 、F r a m e L a y o u t B 、L i n e a r L a y o u t C 、BorderLayout D 、T a b l e L a y o u t E 、R e l a t i v e L a y o u t 4、 D08MA2060 (2分)Intent 的作用的是 a A 、intent 是连接四大组件的纽带,可以实现界面间切换,可以包含动作和动作数据, B 、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会 因为切 换页面而消失 service C 、实现应用程序间的数据共享 contentprovider D 、处理一个应用程序整体性的工作 5、 D04EA1061(1分) 下列哪个是AbsoluteLayout 中特有的属性 b A,android:layout_height B,android:layout_x C,android:layout_above D,android:layout_toRightOf 6、 D07EA1062(1分)RatingBar 组件中不能用属性直接设置的是d A,五角星个数 B,当前分数C,分数的增量D,五角星的色彩 7、 D 10EA1063(1分) 在手机开发中常用的数据库是_a__ A,sqlLite B,Oracle C,Sql Server D,Db23 8、 D14MA2064(2分) 关于BroadcastReceiver 的说法不正确的是_b_ A, 是用来接收广播Intent 的 密封线内不要答 题 学院班级姓名

Android开发的核心知识

想要学习移动应用的开发,除了必备的知识要掌握好之外,更多的是要掌握一些核心的基础知识,并且是能够起到关键性作用的知识点,必须是要了解清楚,如果你也是在学习Android开发,下面的核心基础或者对你有一定的帮助! 1.ListView的引入 为什么要采用listview?其实是在数据量过于庞大时,传统的存储方式它是会占用机器大量内存,最终导致OOM异常(内存溢出),listview的出现将会是有效的解决这个弊端的出现。 重点来了listview如何使用呢? res/layout布局文件中定义listview src的java代码里面关心控件findviewbyid(R.id.listview); 创建适配器对象,适配器继承baseAdapter接口 2.构造方法 getCount();控制listview的条目数 getView();得到当前条目视图 View.inflate();布局填充器 设置适配器:setAdapter(adapter); 设置listview列表项的点击事件:setOnClickLinsstener();

通知listview更新数据:adapter.notifyDataSetChanged(); 3.对话框的使用 *普通对话框 *单选对话框 *多选对话框 *进度对话框 *进度条对话框 *自定义对话框 布局填充器:Viewview=View.inflate(Context,https://www.doczj.com/doc/ff18664511.html,yout.dialog,null); 核心API:dialog.setView(view); 4.常见的一些适配器的使用 *数组适配器:ArrayAdapter *简单适配器:SimpleAdapter 5.数据库的常见的事务 为什么需要需要定义数据库事务?最主要的还是为了保证多条操作语句同步执行 6.数据库事务执行流程 db.beginTransaction();开启事务 db.setTransactionSuccessful();设置事务执行成功 db.endTransaction();结束事务 7.样式和主题 样式的作用在单独的UI控件上面 主题的作用它是在activity或者application上 以上的这些功能控件、数据库等这些是开发中必备的功能,在开发中只要这些基本的核心知识都掌握了,那么这对你接下里的进一步开发是比较有帮助的。

Android应用开发基本知识点汇总

Android应用开发基本知识点汇总 Activity 一生命周期 4种状态 running / paused / stopped / killed 生命周期 Activity启动 onCreate -> onStart -> onResume 点Home返回主界面 onPause -> onStop 再次回到原Activity onRestart -> onStart -> onResume 退出Activity onPause -> onStop -> onDestroy 进程优先级前台/可见/服务/后台/空 二任务栈 三启动模式 standard singleTop 栈顶复用 singleTask 栈内复用 singeInstance 四scheme跳转协议 服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面 Fragment 一第五大组件 为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适Fragment加载到Activity的两种方式 静态加载xml 动态加载fragmentTransaction.add(id, fragment, “name”); .commit; FragmentPagerAdapter与FragmentStatePagerAdapter

FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况FragmentPagerAdapter并没有回收内存,只是detach了Activity 二生命周期 onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach 先创建Activity后创建Fragment,先销毁Fragment后销毁Activity 三Fragment之间的通信 Fragment调用Activity getActivity Activity调用Fragment 接口回调 Fragment调用Fragment方法findFragmentById 四FragmentManager replace add remove Service 一应用场景,与Thread区别 Service是什么后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作 Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后 二开启Service的两种方式 StartService onCreate -> onStartCommand -> onBind -> onDestroy onStartCommand return START_STICKY;

Android开发入门教程

第一篇:安装SDK 这里主要介绍如何安装Android的SDK开发包和配置开发环境。如果你还没有下载SDK,点击下面的链接开始。 Download the Android SDK 系统和软件配置要求 要通过Android SDK中提供的代码和工具进行Android应用程序的开发,需要一个合适的用于开发的电脑和合适的开发环境,具体要求如下: 支持的开发环境 Eclipse Eclipse 3.2,3.3(Europa) Android开发工具插件(可选) 其他的开发环境或者IDE JDK5.0或者JDK6.0(仅有JRE是不够的) 安装SDK 下载好SDK包后,将zip文件解压缩至合适的地方。在下文中,我们默认你的SDK安装目录为$SDK_ROOT 你可以选择将$SDK_ROOT/tools加入到你的路径中 1.Linux下,打开文件~/.bash_profile或者~/.bashrc,找到设定PATH环境变量的一行,将$SDK_ROOT/t ools的完整路径加入其中。如果没有找到设定PATH变量的行,你可以自己添加一行: export PATH=${PATH}:<你的$SDK_ROOT/tools的完全路径> 2.Mac下,在你的home目录中找到文件.bash_profile,和Linux的一样处理。如果还没有在机器上设定这个文件,你可以创建一个.bash_profile文件。 3.Windows下,右键点击【我的电脑】,选择【属性】,在【高级】页中,点击【环境变量】按键,在弹出的对话框中双击“系统变量”中的变量“Path”,将$SDK/tools的完全路径加入其中。 通过将$SDK/tools加入系统路径,在运行adb和其它一些命令行工具时就不需要键入完全路径名了。需要注意到是,当你升级了SDK后,如果安装路径有变动的话,不要忘记了更新你的PATH变量的设置,将其指向变动后的路径。 安装Eclipse插件(ADT) 如果你选择Eclipse作为Android的开发环境,可以安装一个专门为Android定制的插件:Android Deve lopment Tools(ADT),ADT插件集成

Android应用开发基础习题

-- 任务一Android 开发环境的搭建 第一部分知识回顾与思考 1.Android 的四层架构分别包括哪几层?分别起到什么作用? 答:Linux 内核层(Linux Kernel ):基于Linux 内核,内核为上层系统提供了系统服务。 系统库层(Libraries ):系统库基于C/C++ 语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework ):为开发者提供了一系列的Java API,包括图形用户界面组件

View 、SQLite 数据库相关的API 、Service 组件等。 应用程序层(Applications ):包含了Android 平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android 四层架构中,应用框架层使用的是什么语法?(C)A .CB .C++C.Java D.Android 2.Android 四层架构中,系统库层使用的是什么语法?(B)A .VBB.C /C++C.Java D .Android 3.应用程序员编写的Android 应用程序,主要是调用(B)提供的接口进行实现。 A .应用程序层DCB.应用框架层.应用视图层.系统库层

二、填空题(请在括号内填空) 1.在Android 智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android 的(应用程 序)层。 2.为了让程序员更加方便的运行调试程序,Android 提供了(模拟器),可以方便的将程序运行其上, 而不要实际的移动终端。 程序运行,我们需要安装(Java 3.为了支持)。JDK 三、简答题 1.简述Android 开发环境安装的步骤。 答:下载并安装JDK ,配置JDK 的环境变量; 从Anroid 官网上下载Android 开发组件(包含Eclipse 和

ANDROID OPENGL ES 基础知识(基本概念)

基本概念 为了方便后边的编程,我们第一篇文章主要是介绍一些关于OpenGLES基本的概念。点 3D图像的最小单位称为点(point)或者顶点vertex。它们代表三维空间中的一个点并用来建造更复杂的物体。多边形就是由点构成,而物体是由多个多边形组成。尽管通常OpenGL支持多种多边形,但OpenGLEs只支持三边形(即三角形)所以即使我们要绘制一个正方形也要把它拆分为两个三角形绘制。先说说坐标系的问题。 默认情况下,以屏幕中心为坐标轴原点。原点左方x为负值,右边为正值。原点上方y 为正,原点下方为负。垂直屏幕向外为z正,垂直屏幕向里为z负。默认情况下,从原点到屏幕边缘为1.0f,沿各轴增加或减小的数值是以任意刻度进行的–它们不代表任何真实单位,如英尺,像素或米等。你可以选择任何对你的程序有意义的刻度(全局必须保持单位一致,不能一部分使用米,一部分使用像素)。OpenGL只是将它作为一个参照单位处理,保证它们具有相同的距离。如图:

了解了坐标轴,我们来看看怎么在坐标系中表示一个点,通常用一组浮点数来表示点。例如一个正方形的4个顶点可表示为: 1.float vertices[] ={ 2.-1.0f,1.0f,.0f,//左上 3.-1.0f, -1.0f,.0f,//左下 4.1.0f, -1.0f,.0f,//右下 5.1.0f,1.0f,.0f,//右上 6.}; 为了提高性能,通常还需要将浮点数组存入一个字节缓冲中。所以有了下面的操作: 1.ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length *4); //申请内存 2.vbb.order(ByteOrder.nativeOrder()); //设置字节顺序,其中ByteOrder.nativeOrder()是 获取本机字节顺序 3.FloatBuffer vertexBuffer = vbb.asFloatBuffer(); //转换为float型

Android移动应用开发基础教程(微课版)-教学大纲

《Android移动应用开发基础教程(微课版)》教学大纲 学时:62 代码: 适用专业: 制定: 审核: 批准: 一、课程的地位、性质和任务 Android移动应用开发基础是普通高等学校计算机科学与技术专业的一门重要的专业基础课。通过本课程的学习,使学生能够在已有的计算机基础知识基础上,对Android移动应用开发有一个系统的、全面的了解、为掌握移动应用开发打下良好的基础;在系统理解和掌握Android移动应用开发基本原理的基础上,了解和掌握移动应用开发的基本原理和方法,具有设计和开发Android移动应用APP的基本能力。 Android移动应用开发是一门实践性非常强的学科,它要求学生在理解和掌握Android移动应用开发语言语法的基础上,充分利用实验课程,在计算机上动手完成程序的编写和调试。 二、课程教学基本要求 1.课程教学以Android移动应用开发方法为主,在教学过程中让学生掌握Android移动应用开发的基本原理和方法。 2.要求在教学过程中合理安排理论课时和实验课时,让学生有充分的使用在计算机上练习理论课程中学到的Android移动应用开发技巧和方法。 三、课程的内容 第1章 Android开发起步 让学生了解Android平台特点、体系架构和版本,掌握如何搭建Android开发环境,熟悉如何创建Android项目和Android编程的日志工具 第2章 Android核心组件:活动 让学生了解Android核心组件之一的活动是什么、活动生命周期,掌握活动基本操作、在活动中使用Intent、在活动之间传递数据、活动的启动模式。 第3章 UI设计 让学生熟练掌握线性布局、相对布局、通用UI组件、消息通知和菜单。 第4章广播机制 让学生了解广播机制,并熟练掌握如何使用广播接收器。 第5章数据存储 让学生熟练掌握Android文件存储、共享存储和SQLite数据库存储。 第6章多媒体 让学生熟练掌握播放多媒体文件、记录声音、使用摄像头和相册。 第7章网络和数据解析

2016尚学堂Android开发入门教程

android开发者资料大全 第一篇:安装SDK 这里主要介绍如何安装Android的SDK开发包和配置开发环境。如果你还没有下载SDK,点击下面的链接开始。 Download the Android SDK 系统和软件配置要求 要通过Android SDK中提供的代码和工具进行Android应用程序的开发,需要一个合适的用于开发的电脑和合适的开发环境,具体要求如下: 支持的开发环境 Eclipse Eclipse 3.2,3.3(Europa) Android开发工具插件(可选) 其他的开发环境或者IDE JDK5.0或者JDK6.0(仅有JRE是不够的) 安装SDK 下载好SDK包后,将zip文件解压缩至合适的地方。在下文中,我们默认你的SDK安装目录为$SDK_ROOT 你可以选择将$SDK_ROOT/tools加入到你的路径中 1.Linux下,打开文件~/.bash_profile或者~/.bashrc,找到设定PATH环境变量的一行,将$SDK_ROOT/tools的完整路径加入其中。如果没有找到设定PATH变量的行,你可以自己添加一行: export PATH=${PATH}:<你的$SDK_ROOT/tools的完全路径> 2.Mac下,在你的home目录中找到文件.bash_profile,和Linux的一样处理。如果还没有在机器上设定这个文件,你可以创建一个.bash_profile文件。 3.Windows下,右键点击【我的电脑】,选择【属性】,在【高级】页中,点击【环境变量】按键,在弹出的对话框中双击“系统变量”中的变量“Path”,将$SDK/tools的完全路径加入其中。

《Android应用开发》课程标准

《Android应用开发》 课程标准 内蒙古电子信息职业技术学院计算机科学系

一.课程设置概述 1.1课程在相关专业中的性质与定位 Android应用开发是物联网应用技术专业(应用开发方向)的核心课程之一,是Android应用程序开发方法的主要课程,是Android应用的主要领域。为了适应高职学生的学习情况,该课程以Android应用技术为重点,逐步阐述Android 应用体系结构,介绍Android应用常见的几个功能。采用项目+案例教学法,既让学生掌握Android的基本知识,同时,也让学生在潜移默化中了解一些Android 的高级开发技术,从而为今后实现Android应用开发打下基础。 本课程的任务是使学生通过学习和操作实践,了解和掌握Android的主流应用技术及其开发方法,掌握Android的sdk、Activity、高级UI、网络、多媒体体方面的编程技术。为进一步学习移动互联工程师后续课程打下良好的理论和实践基础。 1.2 本课程的基本教学理念 (一)突出学生主体,注重技能培养,回归能力本位 Android应用开发是移动互联工程师的专业核心课程,注重软件开发基本理论、基本方法和基本技能的学习及素质教育,激发学生的学习兴趣,在启发、提示下使其自主地、全面地理解软件的基本理论和基本方法,提高学生的思维能力和实际操作技能,增强他们理论联系实际的能力,培养学生的创新精神,使学生养成观察、独立分析和解决问题的习惯;以提高技能、磨砺意识、活跃思维、展现个性和拓宽视野。 (二)尊重个体差异,注重过程评价,促进学生发展 本课程在教学过程中,倡导自主学习,启发学生对设定问题积极思考、分析,

安卓手机相关基础知识

一、验机: 到货后首先检查手机配件是否齐全由于水货手机多为散件入关所以机器串码和包装盒上的一般都是对不上的(在这里强调一下凡是宣传3码合一即机器开机之后调出的机身串码、机器后 面的串码和包装盒上的串码的其包装盒上的码基本上都是后期在深圳自己打印的)咋们的机器一般都是2码合一的。 然后安装手机电池开机检查手机外观是否有磨损(水货手机过关时多为水客即专门走私的人随身携带所以难免有磕碰)检查屏幕是否有进灰尘、屏幕是否有亮点。照相头是否能正常工作 最后检查一下手机内部的操作系统是否为原生的安卓系统(有些手机安装的是第三方的安卓系统里面有大量的恶意程序会偷用户流量、窃取私人信息等,类似于电脑安装的不是正版的操作 程序自然不会显示正版安装过程中或者安装后的信息),大致查看方式:开机之后是否显示HTC、三星、索爱标识凡是显示什么HTC安智网、开机之后第三方软件比如土豆网、地瓜网等等第三 方软件比较多的基本为非原升系统,这种机器肯定是过关之后刷过机的。 手机版本的大致确定:HTC手机在关机状态下同时按住开关机键、音量下键进入工程模式(不了解显示内容的不要随便选择里面选项退出可以直接拔掉电池)检查最上面一行SOFF 或者SON ,显示SOFF为已经解过锁的机器大致为欧版或者阿拉伯;显示SON为没有解锁机器这是原 版机器。原版机器在设置-语言和键盘选项里查看是台版、港版(显示简体中文、繁体中文、 英文)还 是亚太(亚太为新加坡、印度尼西亚、泰国这些区域凡是显示新加坡英语和泰语的就是亚太版)因为台湾、香港、新加坡、马来西亚、泰国等国家有大量华人所以机器里自带简体中文手机入 境无需解锁重新刷机就可使用。 二、相关知识: 出厂日期查询:1、为什么要查出厂日期?很多顾客都担心自己买到翻新的机器,要是知道机器的出厂日期就可以大致推断了,一般来说一部手机从出厂到销往国外到会大陆到咋们销售6个 月之内还是符合正常销售时间的,但是超出了而且随着超出时间的长短这种风险就越来越大。 2、怎么查?HTC 可以直接登录公司官网可以查到出厂日期和销往地(这样版本也就知道了)还有就是“I找吧”第三方网站但有时这个为什么不准确呢,因为这些网站是根据手机的IMEI 码和 SN码里的信息推测的。三星手机未刷机的可以在拨号键盘输入*#197328640#进入工程代码

Android应用开发入门教程(经典版)

Android应用开发入门教程(经典版) Linux公社(https://www.doczj.com/doc/ff18664511.html,)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC 就是关于Linux的数据中心。 https://www.doczj.com/doc/ff18664511.html,提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。

目录 第一篇Android系统结构和SDK使用 (5) 第1章 Android的系统介绍 (5) 1.1 系统介绍 (5) 1.2 软件结构和使用的工具 (7) 第2章 Android SDK的开发环境 (10) 2.1 Android SDK的结构 (10) 2.2 Android SDK环境安装 (11) 2.2.1. 安装JDK基本Java环境。 (11) 2.2.2. 安装Eclipse (12) 2.2.3. 获得Android SDK (12) 2.2.4(1). 在Eclipse 3.4(Ganymede)中安装ADT (14) 2.2.4(2). 在Eclipse 3.5(Galileo)中安装ADT (17) 2.2.5. 在Eclipse中配置Android SDK (20) 2.3 Android中运行仿真器环境 (21) 2.3.1. 建立Android虚拟设备 (21) 2.3.2. 运行虚拟设备 (22) 2.3.3. 使用Android中的工具 (23) 2.3.4. 使用logcat (24) 2.3.5. 使用仿真器控制 (25) 2.3.6. 命令行工具adb、mksdcard等 (26) 2.3.7. 使用设备控制 (28) 2.4 Android中建立工程 (29) 2.4.1. 建立工程 (29) 2.4.2. 查看和编辑各个文件 (31) 2.4.3. 运行工程 (33) 第二篇 Android应用程序的概述和框架 (36) 第3章 Android应用层程序的开发方式 (36) 3.1 应用程序开发的结构 (36) 3.2 API参考文档的使用 (36) 第4章Android应用程序示例 (40) 4.1 HelloActivity程序的运行 (40) 4.2 HelloActivity的源文件结构 (41) 4.2.1.Android.mk文件 (41) 4.2.2.AndroidManifest.xml文件 (42) 4.2.3.源代码文件 (42) 4.2.4.布局文件 (43) 4.2.5.其他资源文件 (43) 4.3 HelloActivity的编译结构 (43) 4.4 SkeletonApp的程序的运行 (44) 4.5 SkeletonApp的源文件结构 (44) 4.6 SkeletonApp的编译结构 (46) 第5章 Android应用程序的内容 (47) 5.1 Android应用程序的概念性描述 (47) 5.1.1.应用程序的组成部分 (47) 5.1.2.应用程序的生命周期 (48) 5.2 应用程序包含的各个文件 (50) 5.3 使用am工具启动Android应用程序 (51) 2

android开发需要掌握的知识点

Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。首先熟悉java基本语法,然后熟悉设计模式等。 a) Java基础语法:看下面的《Java知识点列表》 b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多(设计模式大概有28种,具体请看设计模式系列),一个一个的全部掌握,是不现实的,必须首先掌握面向对象的基础设计原则,有了这些基础原则的支持,理解android容易很多。 有了这些知识,然后再来学习Android开发,一定会事半功倍。 《Java知识点列表》:这些是别人总结,我只是加些说明。 开发环境: 1 Java SDK 下载和安装 2 环境变量的配置(path和classpath) 编程基础: 3. 标识符命名规范 4 Java数据类型 5 运算符 6 分支语句(if,switch) 7 循环语句(for,while) 8 函数的定义方法 只要是个程序员,都懂。语言之间可以融会贯通。 面向对象基础: 向对象的三个基本特征是:封装、继承、多态 9. 面向对象与面向过程语言之间的区别 10 面向对象基本思想(封装) 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏 11 类的定义方法 12 对象和类的关系 13 对象的创建方法 14 通过对象使用成员变量和成员函数的方法 15 构造函数的作用 16 函数的重载 17 static 的作用 18 this的作用 面向对象高级: 19 面向对象基本思想(继承) 继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进

Android应用开发基础习题集

任务一Android开发环境的搭建 第一部分知识回顾与思考 1.Android的四层架构分别包括哪几层?分别起到什么作用? 答:Linux内核层(Linux Kernel):基于Linux内核,内核为上层系统提供了系统服务。 系统库层(Libraries):系统库基于C/C++语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework):为开发者提供了一系列的Java API,包括图形用户界面组件View、SQLite数据库相关的API、Service组件等。 应用程序层(Applications):包含了Android平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内)1.Android四层架构中,应用框架层使用的是什么语法?( C ) A.C B.C++ C.Java D.Android 2.Android四层架构中,系统库层使用的是什么语法?( B ) A.VB B.C /C++ C.Java D.Android 3.应用程序员编写的Android应用程序,主要是调用( B )提供的接口进行实现。 A.应用程序层B.应用框架层C.应用视图层D.系统库层 二、填空题(请在括号内填空) 1.在Android智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android的(应用程序)层。 2.为了让程序员更加方便的运行调试程序,Android提供了(模拟器),可以

方便的将程序运行其上,而不要实际的移动终端。 3.为了支持Java程序运行,我们需要安装(JDK)。 三、简答题 1.简述Android开发环境安装的步骤。 答:下载并安装JDK,配置JDK的环境变量; 从Anroid官网上下载Android开发组件(包含Eclipse和Android SDK、ADT); 安装Android开发环境(包括配置Android SDK的环境变量、打开Eclipse通过菜单设定Android SDK路径)。 2.简述Android应用程序创建和运行的步骤。 答:通过菜单创建Android应用程序,设置应用程序名、Android版本等基本信息。 点击菜单中的运行按钮可以直接运行Android项目(也可以通过菜单配置运行参数,指定运行的模拟器)。 任务二星座查询工具的设计与实现 第一部分知识回顾与思考 1.Android的属性、方法、监听器如何使用,它们分别起了什么作用? 答:Android控件的属性,可以通过xml文件设定,通过设定控件的属性能够静态的改变控件的样式和一些特性; 控件的方法,可以通过编写代码动态调用方法,在程序中调用方法可以动态的修改控件的样式、也可以获得控件的相关信息; 控件的监听器,可以通过编码为控件创建、设定监听器,监听器可以监听控件发生的事件,一旦发生某个监听的事件可以触发相应的处理代码。

华为安卓基础知识

不要嫌帖子长,看完这帖你可以自己成为有粉丝的大神了!威武吧!新手小白玩机第一课,安卓基础知识大扫盲 关于android(安卓) Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,拥有超强的可定制性。2008年9月22日,美国运营商T-Mobile USA在纽约正式发布第一款 Google 手机——T-Mobile G1。该款手机为HTC代工制造,是世界上第一部使用Android操作系统的手机。安卓刚发布的时候,正是塞班和诺基亚称霸天下的时代,如今只剩下安卓跟IOS平分整个手机市场了。安卓专有名词介绍 1. 固件=操作系统 所谓的固件就是将操作系统固定在手机中的一个固定的位置(硬件上),平时不随意改动,活动的数据另外单独放一边。这样做的目的在于保护内层的系统程序不受文件操作的影响,提高了稳定性。但相对的,如果想要升级系统,就必然涉及对固件的读写更新工作。谷歌的Android系统就被写入在了固件中,即使想要查看也要专门的软件和权限。 2. 刷固件=安装操作系统 正是因为固件固定的原因,在我们想要更新系统的时候。就需要将原固件的文件删掉,将新的文件拷进去。于是就有了刷固件这么一回事(也就是刷机)。就像Windows安装系统一样,把安装盘放进去就可以直接安装。 3. ROM=系统的安装盘 这个东西就是安卓系统的压缩包,你甚至可以用WinRAR去解压它看看里面有什么。我们刷机的时候就是将这个东西刷进固件的。当然,由于安卓系统的开源性质,我们可以自由的改动这个包。 4. 固件版本 由于是谷歌公司在专门开发这个系统,官方放出的话必然是所有机油手机升级的风向标。固件版本就是官方制定的基础系统,所有的改包都会从官方的包开始改。所以官方的一次升级必然会影响整个手机系统的使用情况。就像当年大家都在用XP,后来微软出了win7,于是大家都换win7。 5. ROOT Root权限就相当于你电脑的超级管理员权限,有了root权限就可以更改内部系统的文件了,干一切你想干的事情。但是出于安全性考虑,安卓系统默认隐藏了root权限,但是我们可以通过刷机来获取 root权限。至于如何root,论坛的大大们会教大家。 6. Recovery 在刷机中你经常会看到recovery的身影,从字面上来看就是"恢复"的意思,大家可以直接把recovery当作一个"刷机界面",手机的刷机和获取ROOT也都需要在recovery下进行。

Android架构基本知识

Android架构基本知识 1.2 Android的系统架构 系统构架图中可以看到从上到依次是应用层(Applications)、应用框架层(Application Framework)、系统运行库层(Lib和Runtime)、 Linux内核层(linux kernel) 1.2.1 Android内核 Linux 内核版本2.6 位于硬件和软件堆之间的抽象层 核心服务:安全机制、内存管理、进程管理、网络、硬件驱动。

Android依赖Linux内核2.6来提供核心服务,比如进程管理、网络协议栈、硬件驱动。在这里,Linux内核作为硬件层和系统软件栈层之间的一个抽象层。这个操作系统并非类GNU/Linux的,因为其系统库,系统初始化和编程接口都和标准的Linux系统是有所不同的。 从Google目前release的Linux系统来看,其没有虚拟内存文件系统,系统所用的是yaffs2文件系统,具体的映像也都位于SDK安装目录下。通过emulator -console命令,我们可以在host 终端下得到一个简单的可以控制Android的shell,这个系统包含了一个Toolbox,提供一些基本的命令工具,集中在/sbin,/system/sbin,/system/bin中,但是很简陋,命令种类也很少。若有时间和必要我会作个介绍。 既然采用的linux系统,就有必要介绍一下主要驱动(如图中所示): 显示驱动(Display Driver) 键盘驱动(KeyBoard Driver) Flash内存驱动(Flash Memory Driver) 照相机驱动(Camera Driver) 音频驱动(Audio Driver) 蓝牙驱动(Bluetooth Driver) Wifi驱动 Binder IPC驱动 Power Management (电源管理)等等。 1.2.2程序库和运行库(Lib和Runtime)

相关主题
相关文档 最新文档