当前位置:文档之家› 第2章 Android项目结构分析

第2章 Android项目结构分析

第2章 Android项目结构分析
第2章 Android项目结构分析

电子教案

第2章 Android项目结构分析

教学目标:

课程重点:Android系统架构

应用程序基本组件

应用程序生命周期

资源

AndroidManifest.xml文件

课程难点:应用程序基本组件

应用程序生命周期

教学方法:理论讲解、案例实训

教学过程:

2.1 Android的系统架构

Android作为一个移动设备的开发平台,其系统架构和其他操作系统一样,采用了分层的架构。从架构图2-1看,android从高层到低层分为以下几个层次。

●应用程序层(Application)

●应用程序框架层(Application Framework)

●各种库(Libraries)和运行环境(RunTime)

●linux核心层(OS)

图2-1 Android系统架构图

2.1.1应用程序(Application)

Android的应用程序通常涉及用户界面和用户交互,这类程序是用户实实在在能感觉到的。Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

2.1.2应用程序框架(Application Framework)

普通开发者可以使用Android基本应用程序使用的系统API,Android 应用框架中的各个模块都可以被复用,各种服务也可以被复用,理解了这个机制,开发人员可以更好更轻松地开发出优秀的Android应用。开发过程中常用到的基本框架组件如下:

●一组View(UI 组件),这些UI组件包括Button(按钮),EidtView(文本框),TextView(标签),List(列表)等等,灵活运用这些组件可以快速方便的创建良好的用户交互界面。

●Content Providers(内容提供者),听起来有点抽象,通俗的理解Content Provider 就是提供一种服务,通过这种服务应用程序之间可以实现数据的互相访问和共享,比如通讯录的存储就使用了这种服务,其它应用也可以访问通讯录中存储的联系人信息。

●Resource Manager 顾名思义就是资源管理,android中的资源很多,包括图片,用户界面(Layout xml),字体,颜色,UI组件的Id等等都可以称之为资源,这些丰富的资源,都是通过Resource Manager来统一进行管理。

●Notification Manager(消息通知管理),它在不影响用户正常操作和使用设备的时候在状态栏上提供消息的提示。比如有短信来的时候,android自动会将这个消息提示在状态栏上,用户可以及时的看到。

●Activity Manager(活动管理),Activity管理着应用程序的生命周期,并且控制着应用的导航,扮演控制器的角色。每个Activity类似于Windows应用中的一个wendow。一般的应用都是通过一个个Activity交互构成的。

●Window Manager(窗口管理),管理所有启动的窗口。

●Location Manager(位置管理),用来管理地图服务的相关功能。

●Telephoney Manager(电话管理),用来管理有关的电话的相关功能。

●Package Manager(包管理),管理所有的安装在android系统内的应用程序。

2.1.3 各种库(Libraries)和运行环境(RunTime)

这部分内容开始涉及底层,开发普通的应用不会直接对这个层进行操作。以下是一些核心库。

●系统C库(libc),一个从BSD集成来的标准C系统函数库(libc)它是专门为基于嵌入式Linux的设备定制的。

●媒体库(Media Framework),基于PackeVideo OpenCore,该库支持多种常用的音频,视频格式以及回放和录制,同时支持静态图像文件。编码格式包括:MPEG4、H.264,MP3、AAC、AMR、JPG、PNG。

●Surface Manager 对显示子系统的管理,并且为多个应用提供2D,3D图层的无缝融合。

●WebKit,一个最新的web浏览器引擎,用来支持Andiroid浏览器或者嵌入的web 视图。

●SGL,底层的2D图形引擎。

●OPENGL|ES,基于OpenGL ES 1.0 APIs实现,该库可以使用硬件3D加速或者使用高度优化的3D软加速。

●FreeType,位图(bitmap)和适量(vector)字图显示支持。

●SQLite,一个对所有应用程序可用,功能强大的轻量级关系型数据库引擎。

●Core Libraries 该核心库提供了Java编程语言核心库的大多数功能。

●Dalvik VM, android平台的一个虚拟机,它相当于PC中Java的虚拟机JVM。

Android 的各种库一般是以系统中间件的形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切相关。

Android运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般Java虚拟机(Java VM)不同,它执行的不是Java标准的字节码,而是Dalvik可执行格式(.dex)的执行文件。在执行过程中,每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。

Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

2.1.4 Linux 内核

Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件之间的抽象层,使得应用程序开发人员无需关心硬件细节。对于手机的开发商而言,如果想要Android平台运行到自己的硬件平台上就必须对Linux内核进行修改,通常要做的工作是为自己的硬件编写驱动程序。

2.2应用程序的基本组件

应用程序五大组件。

1. Activity

2. Service

3. Broadcast Receiver

4. Content Provider

5.Intent

然而,并不是所有的应用程序都必须包含上面的五个部分,你的应用程序可以由上面的一个或几个来组建。当你决定使用以上哪些组件来构建Android应用程序时,你应该将它们列在AndroidManifest.xml文件中,在这个文件中你可以声明应用程序组件以及它们的特性和要求。

2.2.1 Activity 简介

在Android程序中Activity代表了手机的一个屏幕,好比https://www.doczj.com/doc/e216022791.html,应用中的一个网页,一个android应用相当于一个web站点。窗口中的可视内容被一系列层次的视图(view)提供——派生自View类的对象(后续章节会详细介绍)。视图就是 activity与用户交互的地方。例如,当用户触动一个显示小图片的视图时,会触发一些动作。Android提供了很多现成的视图供你使用——包括按钮,文本框,滚动条,菜单项,复选框还有更多。

整个视图层次通过Activity.setContentView() 方法放到 activity的窗口上。

下图2-2显示了View的层次结构。

图2-2 View的层次结构图

当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,Android 将会保留从主屏幕到每一个应用的运行屏幕。

同一应用中的每个 Activity 是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个 Activity (默认窗口),而后可以根据需要从这个 Activity 启动另一个新的Activity 。每一个都是作为Activity基类的一个子类的实现。有两个方法是几乎所有的Activity子类都实现的:

(1)onCreate(Bundle):初始化你的活动(Activity),比如完成一些图形的绘制。最重要的是,在这个方法里你通常将用布局资源(layout resource)调用setContentView(int)方法定义你的UI,和用findViewById(int)在你的UI中检索你需要编程地交互的小部件(widgets)。setContentView指定由哪个文件指定布局(main.xml),可以将这个界面显示出来,然后我们进行相关操作,我们的操作会被包装成为一个意图(Intent),然后这个意图对应有相关的activity进行处理。

(2)onPause():处理当离开你的活动时要做的事情。最重要的是,用户做的所有改变应该在这里提交(通常ContentProvider保存数据)。

2.2.2 Service 简介

Service没有可见的用户界面,但能够长时间运行于后台。

一个最好的例子是媒体播放器通过一个播放列表来播放歌曲。这个播放器程序或许有一个或多个activity,来允许用户选择音乐和播放它们。然而,音乐本身不能被activity处理,因为用户希望当他们离开播放器窗口去做其他的事情时,音乐仍然能够播放。为了让音乐能够继续,媒体播放器的 activity可以启动一个在后台运行的服务。系统应该保证音乐服务运行,即使启动的activity窗口已经不在主屏幕上了。所以,我们需要这样的机制——长时间在后台运行的Service。Service运行于应用程序进程的主线程中,因

此Service 不会阻塞其他组件和用户界面。Service 是不能自己启动的,必须通

过Context 对象(如一个Activity )调用startService 或bindService 方法来启动(用这两种方法启动的Service 的生命周期不同)。

2.2.3 Broadcast Receiver 简介

Broadcast Receiver 是对发送出来的Broadcast 进行过滤接收并响应的一类组件。广播是一种同时通知多个对象的事件通知机制。Android 中的广播要么来自于系统,

要么来自普通应用程序。很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。为了响应不同的事件通知,应用程序可以注册不同的Broadcast Receiver 。所有的Broadcast Receiver 都继承自基类BroadcastReceiver 。BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知

后,BroadcastReceiver 可以启动Activity 作为响应,或者通

过NotificationMananger 提醒用户。

2.2.4 Content Provider 简介

在Android 中,每个应用程序都是用自己的用户ID 并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。

Content Provider 可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是Android 文件系统、SQLite 数据库或者其他合理的方式。

当数据需要在应用程序间共享时,我们就可以利用ContentProvider 为数据定义一个URI 。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver, 然后传入响应的URI 就可以了。

Content Provider 继承自基类ContentProvider ,并且实现了一组标准接口。通过这组接口,其他应用程序能对数据进行读写和存储。然而,需要使用数据的应用程序并不是直接调用这组方法,而是通过调用ContentResolver对象的方法来完

成。ContentResolver 对象可以与任意ContentProvider 通信。要为当前应用程序的私有数据定义URI ,就需要专门定义一个继承自ContentProvider 的类,然后根据不同的操作调用的方法去实现这些方法的功能。

ContentResolver 类为应用程序提供了接入Content 机制的方法。要构造一

个ContentResolver 对象可以为构造方法ContentResolver(Context context) 传入一个Context 对象,也可以直接通过Context 对象调用getContentResolver() 方法获得——有了ContentResolver 对象后,就可以通过调用

其query() 、insert() 、update() 等方法来对数据进行操作了。

2.2.5 Intents——连接组件的纽带

以上 4 种基本组件中,除了Content Provider 是通过Content Resolver 激活外,其他 3 种组件Activity 、Service 和Broadcast Receiver 都是

由Intent 异步消息激活的。

Intent 在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此,Intent 是包含具体请求信息的对象。

针对不同的组件,Intent 所包含的消息内容有所不同,且不同组件的激活方式也不同,且不同类型组件有传递Intent 的不同方式。

Intent 是一种运行时绑定(runtime binding )机制,它能够在程序运行的过程中连接两个不同的组件。通过Intent ,你的程序可以向Android 表到某种请求或者意愿,Android 会根据意愿的内容选择适当的组件来处理请求。对于Intent更深入的介绍在后续章节中。

【课堂实训2-1】初识Android应用程序的五大基本组件。

前面我们讲过,并不是所有的应用程序都必须包含上面的五个部分,应用程序可以由上面的一个或几个来组建。现在我们就看一个例子,先来认识一下Activity组件。其余组件后续章节会详细介绍。

实例内容:3个Activity之间的相互切换,每个Activity包含一个按钮,点击按钮就会进入下一个Activity,点击第三个Activity的按钮,会返回第一个Activity。

1.创建工程Activity123。

2.建立第一个Activity,名称为FirstActivity。

代码略。

3.创建第二个Activity,名称为SecondActivity。

代码略。

4.创建第三个Activity,名称为ThirdActivity。

代码略。

5.修改/res/layout/main.xml代码。

6.修改AndroidMainfest.xml代码。

7.运行程序,结果如图所示:

图2-3 实训2-1运行结果图1

图2-4 实训2-1运行结果图2

图2-5 实训2-1运行结果图3

2.3 应用程序生命周期

2.3.1应用程序的生命周期

应用程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android从启动到停止的全过程。Android应用程序的生命周期的终结这个动作并非由应用程序进程本身执行,而是取决于Android系统。那么,系统是根据一个怎样的重要性标准来终止Android应用程序呢?Android根据应用程序的组件以及组件当前运行状态将所有的进程按重要性程度从高到低划分为五个,如下图2-6所示:

图2-6 Android进程的优先级

1.前台进程

前台进程是Android系统中最重要的进程,是与用户正在进行交互的进程。有以下四种情况。

●Activity正在与用户进行交互

●进程被Activity调用,而且这个进程正在与用户进行交互

●进程服务正在执行声明中的回调函数,如OnCreate()OnStart()OnDestroy()

●进程的BroadCastReceiver在执行OnReceive()函数

Android系统在多个前台进程同时运行时,可能会出现资源不足的情况,此时会清除部分前台进程,保证主要的用户界面能够及时响应。

2.可见进程

可见进程是指部分程序界面能够被用户看见,却不在前台与用户交互,不影响界面事件的进程。一个常见的例子是,看见进程的窗口显示在屏幕上,同时前台进程以对话框的形式悬浮在可见进程的窗口上。

如果一个进程包含服务,且这个服务正被用户可见的Activity调用,此进程同样被视为可见进程。

Android进程一般存在少量的可见进程,只有在特殊情况下,Android系统才会为保证前台进程的资源而清除可见进程。

3.服务进程

服务进程是指包含已启动Service(服务)的进程。这些进程没有用户界面并且在后台长期运行。Android系统除非不能保证前台进程和可见进程所必要的资源,否则不强行清除服务进程。

4.后台进程

后台进程是指不包括任何已经启动的Service(服务),而其没有任何用户可见的Activity的进程。Android系统中一般存在数量较多的后台进程,在系统资源紧张时,系统将优先清除用户较长时间没有见到的后台进程。

5.空进程

空进程是不包含任何Activity的进程。这种进程存在的唯一理由是提供一种缓存机制,使得缩短应用程序下次启动所需的时间。系统会经常中止空进程,从而达到调节程序缓存和系统缓存的平衡。

空进程在系统紧张时会被首先清除。

除了以上优先级以外,以下两个方面也决定了优先级。

●进程的优先级取决于所有组件中优先级最高的部分。

●进程的优先级会根据其他进程的依赖关系而变化。

2.3.2 Actvity生命周期

每个Actvity的状态由它所在Activity栈中的位置所决定,所有当前正在运行的Actvity将遵循后进先出的原则。当一个新的 Activity启动,当前的Activity将移至堆栈的顶部,如果用户使用Back按钮,或在前台Activity被关闭,下一个Activity将被激活并且移至到堆栈的顶部。这个过程如下图2-7所示:

图2-7 Activity堆栈图

随着Activity的创建和销毁,可能会经历以下四种状态:

Active(活跃)状态:这时候Activity处于栈顶,且是可见的,有焦点的,能够接收用户输入。Android会尽可能维持处于活跃状态的Activity,甚至中止其他Activity以确保它有它所需的资源。当另一个Activity变成Active时,当前的将变成Paused状态。

Paused(暂停)状态:在某些情况下,你的Activity是可见的,但没有焦点,在这时候,Actvity处于Paused状态。例如,你的 Activity处于暂停状态,有一个透明或非全屏

幕上的Activity在你的Actvity上面。当处于Paused状态时,该Activity仍被认为是Active的,但是它不接受用户输入事件。一般情况下,Android不会结束处于暂停状态的Activity,在极端情况下,如果资源极其不足,系统将结束暂停的Activity,以进一步回收资源。当一个Actvity完全被遮住时,它将进入Stopped状态。

Stopped (结束)状态:当Activity是不可见的时,Activity处于Stopped状态。Activity将继续保留在内存中保持当前的所有状态和成员信息,假设系统别的地方需要内存的话,这时它是被回收对象的主要候选。

Inactive(已被销毁或未启动)状态:Activity彻底结束或关闭后,处于Inactive状态。这时Activity从Activity堆栈中已被移除,需要重新启动才可以显示和使用。

Activity的生命周期是指一个Activity从创建到销毁的过程,期间可能经历多个状态的变化迁移,每次状态迁移都会触发相应的回调方法。以下就是Activity的回调方法:

●onCreate

●onStart

●onRestart

●onResume

●onPause

●onStop

●onDestroy

我们还可以把以上7种状态归纳为三组。

●完整的生命周期

●可见的生命周期

●活跃的生命周期

表2-1给出了三种生命周期所对应的回调函数。

表2-1 三种生命周期所对应的回调函数

Activity完整的生命周期

完整的Activity生命周期之间从调用的OnCreate开始,到调用onDestroy结束。有可能在某些情况下,一个Activity被终止时并不调用onDestroy方法。

使用OnCreate方法来初始化你的Activity:初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程。在OnCreate方法传递的对象Bundle包含最后一次调用onSaveInstanceState保存的UI状态。你可以使用这个Bundle恢复用户界面到以前的状态,无论是OnCreate方法或通过覆盖onRestoreInstanceStateMethod方法。

覆盖onDestroy方法来清理OnCreate中创建的任何资源,并确保所有外部连接被关闭,例如网络或数据库连接。

为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响。如果你的Activity需要创建一些对象的话,最好在onCreate方法中创建,因为它仅调用一次在一个Actvity的完整生命周期中。

Activity可见的生命周期

一个Activity可见的生命周期始于OnStart调用,结束于OnStop调用。在这两个方法中间, Activity将会对用户是可见的,尽管它可能没有焦点,也可能部分被遮挡着。在一个Activity完整的生命周期中可能会经过几个Activity可见的生命周期,比如应用程序在在前台和后台之间反复切换。

OnStop方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序。当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序。

当一个Activity被重现可见时,onRestart方法优先于onStart被调用,使用它可以实现一些Activity重新可见时的特殊的处理。

OnStart / OnStop方法也被用来注册和注销BroadercastReceiver。

Activity活跃的生命周期

一个Activity活跃的生命周期始于OnResume调用,结束于OnPause调用。一个活跃的Activity总是在前台并且接收用户的输入事件。当一个新的Activity启动,或该设备进入休眠状态,或失去焦点,Activity活跃的生命周期就结束了。尽量在onPause和onResume 方法中执行简洁的代码以确保应用程序能够快速响应Activity在前台和后台之间切换。

在调用onPause之前,onSaveInstanceState会被调用。这个方法提供了一个机会保存当前的UI状态到Bundle当中。 Bundle信息将会被传递到OnCreate和onRestoreInstanceState方法。使用onSaveInstanceState保存 UI状态(如检查按钮状态,用户焦点,未提交用户输入)能够确保当Activity下次被激活时能呈现和目前相同的用户界面。

下面图2-8给出了activity生命周期中可能经历的状态变化。

图2-8 activity生命周期中可能经历的状态变化【课堂实训2-2】近看Activity 的生命周期。

实训内容:例子给出了当Activity状态变化时触发相应的回调方法。我们使用android.util.log类,在Activity状态变化点记录下相应的日志。

代码略。

使用Eclipse->Window->Show View->Other->Android->LogCat,选择即可显示日志输出。

1.运行程序,可以看到如图2-9所示的日志信息:

图2-9 程序启动时的日志信息

2.点击模拟器中的Home键的时候,可以看到如图2-10所示的日志信息:

图2-10 点击模拟器中的Home键时的日志信息

3.点击模拟器中的“返回”键,可以看到如图2-11所示的日志信息:

图2-11 程序结束时的日志信息

2.4 资源

Android资源是应用程序的资产(包括图像、本地化字符串、XML布局等),资源是外部文件(不含代码的文件),它被代码使用并在编译时编入应用程序。看看第一个例子HelloAndroid源代码目录,有一个是res的目录,它存放的就是应用程序需要的各种资源。

2.4.1 创建、管理资源

Android支持不同类型的资源文件,包括XML,PNG以及JPEG文件。每个对象语法、格式以及它们存储位置的支持,都是取决于不同类型的对象。通常,可以通过三种类型的文件来创建资源:XML文件(除位图以及原数据文件)、位图文件(对于图片)以及原始数据(其他类型,例如声音文件等)。事实上,有两种不同类型的XML文件,一种是编译到包里的,另一种是通过aapt来产生的资源文件,下面是包含所有资源类型,文件格式、文件描述以及所有XML文件的详细信息的列表。

表2-2

在代码里使用这些资源类。

2.4.2 使用资源

使用资源包括三种方法:

在代码里使用资源类;

在代码中调用资源并实例化;

从其他资源类里引用,这样可以重用通用资源。

上一节提到的R类,它指向应用程序中所有的资源。这个类包含很多子类。每一种都是Android支持的,同时在编译后会产生一个资源文件。每个类提供一个或多个编译资源的标识符,开发者可以在代码中使用这些标识符。

注意:这个R类是自动产生的,不能通过手工编写。当资源变化时,它会自动更新。【课堂实训2-3】资源的创建管理和使用。

1.创建一名称为“resourcedemo”的工程,创建完工程后,在Eclipse中定位至

/res/values/strings.xml文件,双击编辑它。

代码如下:

Hello

resourcedemo

资源创建的例子

其中:资源创建的例子是自己添加的资源。

2.保存Strings.xml文件。Eclipse插件将自动在工程中生成R.java文件,并含有适当的资源ID,以供编译之后使用程序访问这些资源。定位到/gen/目录下的R.java文件,你可以看到如下代码:

package com.resource;

public final class R {

public static final class attr {

}

public static final class drawable {

public static final int icon=0x7f020000;

}

public static final class layout {

public static final int main=0x7f030000;

}

public static final class string {

public static final int app_name=0x7f040001;

public static final int example=0x7f040002;

public static final int hello=0x7f040000;

}

}

3. 创建好资源并保存后,可以在程序使用资源。定位到/res/layout/main.xml,双击编辑代码,如下所示:

xmlns:android="https://www.doczj.com/doc/e216022791.html,/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/example"

/>

其中android:text="@string/example"是添加的新代码,意思是定义text的内容为string类别下的资源,名字叫做example,内容为“资源创建的例子”。

4.运行程序,结果如下图所示:

图2-12 资源创建并使用的运行结果

2.5 AndroidManifest.xml 文件

2.5.1 AndroidManifest.xml 的文件组织结构

每个Android的application都必须包含一个AndroidManifest.xml,且文件名是固定的,不能修改。应用程序需要通过它向Android系统提供一些必需的信息,且需要在application运行前提供给系统,如下图2-13所示:

图2-13 Android应用程序的组件

AndroidManifest.xml主要包含以下功能:

?说明application的java 数据包,数据包名是application的唯一标识;

?描述application的component;

?说明application的component运行在哪个process下;

?声明application所必须具备的权限,用以访问受保护的部分API,以及与其他application的交互;

?声明application其他的必备权限,用以component之间的交互;

?列举application运行时需要的环境配置信息,这些声明信息只在程序开发和测试时存在,发布前将被删除;

?声明application所需要的Android API的最低版本级别,比如1.0,1.1,1.5;

?列举application所需要链接的库。

AndroidManifest.xml的结构和规则:

?元素:在所有的元素中只有是必需的,且只能出现一次。如果一个元素包含有其他子元素,必须通过子元素的属性来设置其值。处于同一层次的元素,这些元素的说明是没有顺序的。

?属性:按照常理,所有的属性都是可选的,但是有些属性是必须设置的。那些真正可选的属性,即使不存在,其也有默认的数值项说明。除了根元素的属性,所有其他元素属性的名字都是以android:为前缀的。

?定义类名:所有的元素名都对应其在SDK中的类名,如果你自己定义类名,必须包含类的数据包名,如果类与application处于同一数据包中,可以直接简写为“.”。

?多数值项:如果某个元素有超过一个数值,这个元素必须通过重复的方式来说明其某个属性具有多个数值项,且不能将多个数值项一次性说明在一个属性中。

?资源项说明:当需要引用某个资源时,其采用如下格式:@[package:]type:name。例如

?字符串值:类似于其他语言,如果字符中包含有字符“\”,则必须使用转义字符“\\”。

2.5.2 在AndroidManifest.xml 中声明权限

权限声明在智能手机中是一种比较常见的应用程序保护机制,其基本思想是通过AndroidManifest.xml文件中显式地声明应用程序需要的权限,防止应用程序错误地使用服务,不恰当访问资源,最终达到提高Android应用程序的健壮性,改善用户体验的目的。Android中每种权限都用一个独立的标签表示, 如:android.permission.SEND_SMS,android.permission.CALL_PHONE。如果需要使用发短信的权限,应使用如下标签:

Android系统定义的所有权限可以在类Manifest.permission中找到。需要注意的是,在Manifest.permission类中表示发短信权限的变量是SEND_SMS,用户在AndroidManifest.xml中声明使用权限是应在SEND_SMS前加上前

缀android.permission 。

除了Android自带的权限以外,应用程序还可以对自己的组件进行权限声明,以保护其他应用程序不乱用自己的组件。

声明本组件被其他组件调用时的权限,使用如下标签:

【课堂实训2-4】通过helloWord程序认知AndroidManifest.xml文件。

在第一章我们编写了一个简单的Android程序Hello Android。我们按照建立这个应用程序的步骤再建立一个程序HelloWorld,几乎一模一样,就是名称变了。具体步骤参考第一章。项目建立完可以看到如下目录结构,其中有AndroidManifest.xml文件。

图2-14 HelloWorld项目的目录结构

下面是AndroidManifest.xml文件的代码:

xmlns:android="https://www.doczj.com/doc/e216022791.html,/apk/res/android"

package="hello.test"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

android:label="@string/app_name">

android:name="https://www.doczj.com/doc/e216022791.html,UNCHER" />

代码解释:

文件中,除去头部XML信息说明,首先是manifest项—根节点,其属性包括:schemas URL地址、包名(moandroid.flashlight),以及程序的版本说明。其次是manifest的子节点application,其属性包括:程序图标、程序名称。前面带有@表示引用资源,例如:@drawable/icon表示引用的是drawable资源中的icon,可以在其源工程的res/drawable 中找到。然后就是application的子节点activity,其属性包括:activity的名称、activity 的标签名,其子节点intent-filter则是对activity的说明。

而在intent-filter中,action android:name=”android.intent.action.MAIN”和category andr oid:name=”https://www.doczj.com/doc/e216022791.html,UNCHER”用以说明程序启动时的入口activity是哪个。如果这两个属性值中分别含有MAIN和LAUNCHER,则说明它就是启动程序时的入口活动。

uses-sdk android:minSdkVersion=”2″说明程序使用的Android SDK的最低版本,其中1表示Android 1.0,2表示Android 1.1,而3则表示Android 1.5。

在Eclipse中创建工程后,会自动生成一个AndroidManifest.xml文件。在代码编写的过程中,需要同时修改AndroidManifest.xml,如果配置出现错误会导致程序不能正常运行。

其他更为详细的元素、属性以及值的说明,可查阅Android SDK开发指南中的详细内容。本章小结

本章分析了Android应用程序的构成和各个基本组件的主要作用,同时介绍了Activity 的生命周期,及如何在应用程序中创建和使用资源。各个组件的使用方法将在后面的章节中结合实例详细介绍。

教学资源:多媒体课件、多媒体机房。

教学评价:通过详细介绍Android应用程序的构成和各个基本组件的主要作用,同时介绍了Activity的生命周期,及如何在应用程序中创建和使用资源,让学生有个全面的认识,然后再通过上机实训,真正让学生认识Android项目结构的特点。讲练结合,学生容易接受。

Android Hotfix 新方案——Amigo 源码解读

Android Hotfix 新方案——Amigo 源码解读 首先我们先来看看如何使用这个库。 用法 在project 的build.gradle中 dependencies { classpath 'me.ele:amigo:0.0.3' } 在module 的build.gradle中 apply plugin: 'me.ele.amigo' 就这样轻松的集成了Amigo。 生效补丁包 补丁包生效有两种方式可以选择: ? 稍后生效补丁包 ? 如果不想立即生效而是用户第二次打开App 时才打入补丁包,则可以将新的Apk 放到/data/data/{your pkg}/files/amigo/demo.apk,第二次打开时就会自动生效。可以通过这个方法 ? File hotfixApk = Amigo.getHotfixApk(context); ?

获取到新的Apk。 同时,你也可以使用Amigo 提供的工具类将你的补丁包拷贝到指定的目录当中。 ? FileUtils.copyFile(yourApkFile, amigoApkFile); ? ? 立即生效补丁包 ? 如果想要补丁包立即生效,调用以下两个方法之一,App 会立即重启, 并且打入补丁包。 ? Amigo.work(context); ? Amigo.work(context, apkFile); ? 删除补丁包 如果需要删除掉已经下好的补丁包,可以通过这个方法 Amigo.clear(context); 提示:如果apk 发生了变化,Amigo 会自动清除之前的apk。 自定义界面 在热修复的过程中会有一些耗时的操作,这些操作会在一个新的进程中的Activity 中执行,所以你可以通过以下方式来自定义这个Activity。

Android源码下载方法详解

Android: Android源码下载方法详解 分类:Android平台 安卓源码下载地址:https://www.doczj.com/doc/e216022791.html,/source/downloading.html 相信很多下载过内核的人都对这个很熟悉 git clone git://https://www.doczj.com/doc/e216022791.html,/kernel/common.git kernel 但是这是在以前,现在如果这么执行的话,会显示如下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ https://www.doczj.com/doc/e216022791.html,[0: 149.20.4.77]: errno=Connection refused fatal: unable to connect a socket (Connection refused) 通过浏览器输入https://www.doczj.com/doc/e216022791.html,/,发现该网站已经被重定向为 https://www.doczj.com/doc/e216022791.html,/source/downloading.html 可以在该页面的最后发现内核的下载方法。 下面我们介绍一下Android源码下载的步骤。 工作环境: 操作系统:Ubuntu 10.04 或Ubuntu10.10 git程序:1.7.0.4 或1.7.1 转载请注明出处:https://www.doczj.com/doc/e216022791.html,/pku_android 方法一: 1.1 初始化安装环境 参考网页https://www.doczj.com/doc/e216022791.html,/source/initializing.html 主要要做的就是安装jdk和安装一些软件包 $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \ libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \ libxml2-utils 如果已经安装了,就不许要这步了 1.2 无论下载内核和源码,都需要进行如下操作 参考网页https://www.doczj.com/doc/e216022791.html,/source/downloading.html $ mkdir ~/bin $ PATH=~/bin:$PATH $ curl https://https://www.doczj.com/doc/e216022791.html,/dl/googlesource/git-repo/repo > ~/bin/repo 如果出现: repo init error: could not verify the tag 'v1.12.7',

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

Android USB 驱动分析

Android USB 驱动分析 一、USB驱动代码架构和使用 1、代码简介 USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c, f_adb.c, f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于 f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。 可在android.c中看到: static int __init android_bind_config(struct usb_configuration *c) { struct android_dev *dev = _android_dev; int ret; printk(KERN_DEBUG "android_bind_config\n"); ret = mass_storage_function_add(dev->cdev, c, dev->nluns); if (ret) return ret; return adb_function_add(dev->cdev, c); } 2、驱动使用 要使USB mass storage连接到主机: 打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向 file文件写入一个存储 设备的路径,例如/dev/block/vold/179:0 (major:minor)路径; 这里的usb_mass_storage根据实际应用可以改的,由 platform_device_register函数的参数决 定。 例如: static struct platform_device fsg_platform_device = { .name = "usb_mass_storage", .id = -1, }; static void __init tegra_machine_init(void) { .... (void) platform_device_register(&fsg_platform_device); .... }

Android 串口编程原理和实现方式附源码

提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:。下面我分别对JNI、以及串口的一些知识点和实现的源码进行分析说明。这里主要是参考了开源项目android-serialport-api。 串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习。在Java中如果要实现串口的读写功能只需操作文件设备类:即可,其他的事都由驱动来完成不用多管!当然,你想了解,那就得看驱动代码了。这里并不打算对驱动进行说明,只初略阐述应用层的实现方式。 (一)JNI: 关于JNI的文章网上有很多,不再多做解释,想详细了解的朋友可以查看云中漫步的技术文章,写得很好,分析也很全面,那么在这篇拙文中我强调3点: 1、如何将编译好的SO文件打包到APK中?(方法很简单,直接在工程目录下新建文件夹libs/armeabi,将SO文件Copy到此目录即可) 2、命名要注意的地方?(在编译好的SO文件中,将文件重命名为:lib即可。其中是编译好后生成的文件) 3、MakeFile文件的编写(不用多说,可以直接参考package/apps目录下用到JNI的相关项目写法) 这是关键的代码: [cpp]view plaincopy

(二):

文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的或。这是API的描述,不太好理解,其实可简单的理解为:就是对一个文件进行读写。 (三)实现串口通信细节 1) 建工程:SerialDemo包名:org.winplus.serial,并在工程目录下新建jni和libs两个文件夹和一个org.winplus.serial.utils,如下图: 2) 新建一个类:SerialPortFinder,添加如下代码: [java]view plaincopy 1.package org.winplus.serial.utils; 2. 3.import java.io.File; 4.import java.io.; 5.import java.io.IOException; 6.import java.io.LineNumberReader; 7.import java.util.Iterator; 8.import java.util.Vector; 9. 10.import android.util.Log; 11. 12.public class SerialPortFinder { 13. 14.private static final String TAG = "SerialPort"; 15.

App工程结构搭建:几种常见Android代码架构分析

App工程结构搭建:几种常见Android代码架构分析 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的。 从艺术的角度看,其实我们是在追求一种美。 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板。 1. 微盘 微盘的架构比较简单,我把最基本,最主干的画了出来: 第一层:com.sina.VDisk:com.sina(公司域名)+app(应用程序名称) 。 第二层:各模块名称(主模块VDiskClient和实体模块entities)第三层:各模块下具体子包,实现类。 从图中我们能得出上述分析中一个最简单最经典的结构,一般在应用程序包下放一些全局的包或者类,如果有多个大的模块,可以分成多个包,其中包括一个主模块。 在主模块中定义基类,比如BaseActivity等,如果主模块下还有子模块,可以在主模块下建立子模块相应的包。说明一点,有的时候如果只有一个主模块,我们完全可以省略掉模

块这一层,就是BaseActivity.java及其子模块直接提至第二层。 在实体模块中,本应该定义且只定义相应的实体类,供全局调用(然而实际情况可能不是这样,后面会说到)。在微盘应用中,几乎所有的实体类是以xxx+info命名的,这种命名也是我赞成的一种命名,从语义上我觉得xxxModel.java这种命名更生动更真实,xxxModel给我一种太机械太死板的感觉,这点完全是个人观点,具体操作中以个人习惯为主。还有一点,在具体的xxxInfo,java中有很多实体类中是没有get/set的方法,而是直接使用public的字段名。这一点,我是推荐这种方式的,特别是在移动开发中,get/set方法很多时候是完全没有必要的,而且是有性能消耗的。当然如果需要对字段设置一定的控制,get/set方法也是可以酌情使用的。 2. 久忆日记 相比于微盘的工程结构,久忆日记的结构稍微复杂了一些。如下图: 1).第一层和前面微盘一样的. 2).第二层则没有模块分类,直接把需要的具体实现类都放在下面,主要日记的一些日记相关的Activity。 3).第二层的实体包命令为model包,里面不仅存放了实体类

最全的Android源码目录结构详解

最全的Android源码目录结构详解 Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置) |-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (部分厂家开源的硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (底层文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构) | |-- arm (arm架构) | |-- bsdsrc (?bsd的源码)

android源码分析精典

Android 2.1 源码结构分析 lee Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置)|-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (主要保护硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能) |-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构) | |-- arm (arm架构)

Android Galler2源码分析

图库Gallery2 Gallery2主要功能是实现本地存储器、MTP存储器和网络存储器中媒体(图像和视频)的浏览、显示和更多操作(删除、分享、选择和缩放等)。下面用一张简单的用例图描述了Gallery2的功能和职责。 Gallery 主要是4个页面的跳转: AlbumSetPage.Java(相册缩略图); AlbumPage.java(单个相册照片缩略图); PhotoPage.java(单张照片); SlideShowPage.java(幻灯片界面); 跳转过程: AlbumSetPage.Java→AlbumPage.java→PhotoPage.java SlideShowPage.java是单独的。 这些界面类父类为ActivityState.java;这些界面的切换由StateManager.java负责。 1 界面跳转过程: 在Galley2模块,我们先从程序的入口看起,在androidManifest.xml中注册Application标签(Android 系统会为每个程序运行时创建一个Application的类对象且仅创建一个,他的生命周期等于这个程序的生命周期,它是全局的单实例的,一般做一些全局的初始化操作),应用创建时就会被初始化,维护应用内部全局数据,主要看几个函数:initializeAsyncTask(), GalleryUtils.initialize(this),GalleryUtil是Gallery的工具类,获得了屏幕参数,WindowManager,Resource等

Gallery 从launcher进入Gallery,进入GalleryActivity.ava @Override protected void onCreate(Bundle savedInstanceState) { …... setContentView(https://www.doczj.com/doc/e216022791.html,yout.main); if (savedInstanceState != null) { getStateManager().restoreFromState(savedInstanceState); } else { initializeByIntent(); } } private void initializeByIntent() { Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)){ startGetContent(intent); } else if(Intent.ACTION_PICK.equalsIgnoreCase(action)) { // We do NOT really support the PICKintent. Handle it as // the GET_CONTENT. However, we needto translate the type // in the intent here. Log.w(TAG, "action PICK is notsupported"); String type =Utils.ensureNotNull(intent.getType()); if(type.startsWith("vnd.android.cursor.dir/")) { if(type.endsWith("/image")) intent.setType("image/*"); if(type.endsWith("/video")) intent.setType("video/*"); } startGetContent(intent);

Android系统分析

Android操作系统分析 穆英华 基于Linux内核的Android操作系统尽管非常年轻,却已经占领了智能手机9%的市场,而且还在向其它移动平台及嵌入式领域迅速扩张着。下图为2010年一季度的智能手机操作系统占有率统计。在国内外制造商纷纷推出基于Android的产品、Android Market中的应用程序飞速增长的背景下,有必要对Android操作系统的情况进行调研,对比其与Midinux的优劣势、估计其机遇或威胁。本文将从以下几个方面分析Android:目标用户群、支持硬件架构、平台技术架构、应用程序数量、未来发展方向。 一.目标用户群 覆盖高、中、低端智能手机用户是Android的主要目标,尤其是市场上基于ARM11处理器的智能手机已经降到1000元人民币的价格,让低成本的硬件配置也可以运行Android系统,更使得Android从中高端扩展到低端成为可能。除智能手机外,Android已经渗透到了平板电脑、上网本,乃至汽车电子、机顶盒、电子相册、无绳电话等各移动平台和嵌入式产品领域。 对于Android的智能手机和平板电脑用户,Android Market中种类丰富和数量众多的应用程序是其选择Android的重要原因,没有众多可选择的第三方应用程序,操作系统就是再性能优异,也不会对用户有任何杀伤力。这一点类似于苹果的iOS,但总体来说,Android 的用户不会像苹果用户那样忠诚、他们中的很大一部分也不会像苹果用户那样为数码产品花费那么多金钱,可以说Android更大众一些。 二. 支持硬件架构 1.支持的硬件架构 目前Android已经移植到了ARM、X86、M IP S各体系架构中的很多处理器核、处理器芯片、以及更多的板级结构上,对PPC等体系架构的移植也早已开始。如高通、三星等芯片制造商推出的基于ARM C ortex-A8处理器核及P o w er V R显示核心的处理器芯片早已移植Android成功,并被联想的Le Ph one、魅族的M9等许多手机采用,多核的C ortex-A9也蓄势待发。随着

最全的Android源码目录结构详解

最全的Android源码目录结构详解 收藏 转自http: 67."html Android 2."1 |-- Makefile |-- bionic(bionic C库) |-- bootable(启动引导相关代码) |-- build(存放系统编译规则及generic等基础开发包配置)|-- cts(Android 兼容性测试套件标准) |-- dalvik |-- development |-- external |-- frameworks |-- hardware |-- out |-- packages |-- prebuilt |-- sdk |-- system

`-- vendor bionic目录 |-- libc ||-- arch-arm ||-- arch-x86 ||-- bionic ||-- docs ||-- include ||-- kernel ||-- private ||-- stdio ||-- stdlib ||-- string ||-- tools ||-- tzcode ||-- unistd |`-- zoneinfo |-- libdl |-- libm ||-- alpha ||-- amd64(dalvik JAVA虚拟机)

(应用xx相关) (android使用的一些开源的模组) (核心框架——java及C++语言) (部分厂家开源的硬解适配层HAL代码) (编译完成后的代码输出与此目录) (应用程序包) (x86和arm架构下预编译的一些资源) (sdk及模拟器) (底层文件系统库、应用及组件——C语言)(厂商定制代码)(Cxx) ARM架构,包含系统调用汇编实现) x86架构,包含系统调用汇编实现) (由C实现的功能,架构无关) (文档) (头文件) (Linux内核中的一些头文件) (?nesbsd系统相关,具体作用不明) (?一些私有的头文件) (stdio实现) (stdlib实现) (string函数实现)

Android 5.0 Camera系统源码分析(5):Camera预览3A流程

Android 5.0 Camera系统源码分析(5):Camera预览3A流程 1. 前言 本文分析的是Android Hal层的源码,硬件平台基于mt6735。之前几篇讲的预览流程中3A 相关的环节都忽略了,现在重新整理下。 3A指的是Auto Exposure,Auto Focus,Auto White Balance。这三个一起放上来代码实在太多了,这里将重点记录AF的代码。AF的部分工作是由ISP完成的,而ISP的大部分代码mtk都没有开放给我们,比如ISP是如何计算得到对焦位置信息的,但得到对焦位置之后怎么操作对焦马达的代码我们是看得到的,所以涉及到ISP的一些代码将被略过 2. 初始化3A 3A的初始化在DefaultCam1Device的onInit函数里面开始,之前在camera打开流程里面已经提到过 bool DefaultCam1Device:: onInit() { ...... // (1) Open 3A mpHal3a = NS3A::IHal3A::createInstance( NS3A::IHal3A::E_Camera_1, getOpenId(), LOG_TAG); ...... } 构造一个Hal3A对象,看下Hal3A::createInstance的实现 Hal3A* Hal3A:: createInstance(MINT32 i4SensorDevId, MINT32 i4SensorOpenIndex) { switch (i4SensorDevId) { case SENSOR_DEV_MAIN: Hal3ADev::getInstance()->init(i4SensorDevId, i4SensorOpenIndex); return Hal3ADev::getInstance();

最全的Android源码目录结构详解

最全的Android源码目录结构详解收藏 转自https://www.doczj.com/doc/e216022791.html,/a/android/2010/0622/67.html Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置) |-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (部分厂家开源的硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (底层文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构)

android天气预报源代码解析

通过google接口在Android中实现天气预报效果 Android可以通过google实现获取指定经纬度位置或者某一个城市的天气信息。如果是根据经纬度查询天气信息,需要对精度为进行转换,例如lat值为31.174165,需要过滤掉小数点,变为31174165传到接口中,维度也一样处理,处理后传 给https://www.doczj.com/doc/e216022791.html,/ig/api?weather=,,,31174165,121433841既可以获取数据。这里要注意一个问题,如果大家获取的经纬度序列很长,直接去掉小数点,有时候也无法获取天气信息,例如40.478224838152528,124.97828006744385,去掉小数点后,传到参数位置,无法获取值,需要大家将经纬度按下面方式转换一下,只取小数点后6位就可以了。int latI = (int) (lat * 1E6); int lonI = (int) (lon * 1E6); 下面的例子演示了根据输入城市,获取该城市的天气预报,Weather.java的61行,是根据经纬度获取天气信息。 工程结构:

Weather.java类 package com.AndroidWeather; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle;

android应用程序源码结构分析

1、src文件夹存放源码。 2、gen下有跟src中一样的包文件,内部有一个名为R.java类,它是自动生成的一个类;该目录不用我们开发人员维护,但又非常重要的目录。该目录用来存放由Android 开发工具所生成的目录。该目录下的所有文件都不是我们创建的,而是由系统自动生成的。这个R,javav文件是只读类型,用户一般式不需要修改的! R.java 文件中默认有attr 、drawable 、layout 、string 等四个静态内部类,每个静态内部类分别对应一种资源,layout 静态内部类对应layout 中的界面文件main.xml,其中每个静态内部类中的静态常量分别定义一条资源标识符,如“ publicstatic final int main =0x7f030000; ” 用一个十六进制的数来代表常量,当开发者在res文件夹下添加或删除任何一个文件或一个属性,R.java都会随之进行更新! 3、android 2.3.3/ 文件夹表明了开发环境的版本,内部存放Android 自身的jar 包。 4、assets/该目录用来存放应用中用到的类似于视频文件、MP3 一些媒体文件。 5、res/ 该目录为资源目录。该目录可以存放一些应用图标、界面文件、应用中用到的文字信息等。 res/目录下有三个dawable 文件夹,区别只是将图标按分辨率高低来放入不同的目录中,drawable-hdpi存放高分辨率的图标,drawable-mdpi存放中等分辨率的图标, drawable-ldpi存放低分辨率的图标。程序运行时可以根据手机分辨率的高低选取相应目录下的图标。 值得注意的是: 如果是老版本的,比如是1.5版本的,res下的drawable文件夹只有一个,如需修改需要手动添加, res/目录下layout/的文件main.xml是布局文件, main.xml < LinearLayout xmlns:android = "https://www.doczj.com/doc/e216022791.html,/apk/res/android" android:orientation = "vertical" android:layout_width = "fill_parent"

Android程序启动过程源码分析

Android应用程序启动过程源代码分析 分类:Android 2011-08-19 00:58 5447人阅读评论(40) 收藏举报 前文简要介绍了Android应用程序的Activity的启动过程。在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity 的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程。 在上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划中,我们举例子说明了启动Android应用程序中的Activity的两种情景,其中,在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。这种启动方式的特点是会启动一个新的进程来加载相应的Activity。这里,我们继续以这个例子为例来说明Android应用程序的启动过程,即MainActivity的启动过程。 MainActivity的启动过程如下图所示:

点击查看大图下面详细分析每一步是如何实现的。 Step 1. Launcher.startActivitySafely

在Android系统中,应用程序是由Launcher启动起来的,其实,Launcher本身也是一个应用程序,其它的应用程序安装后,就会Launcher的界面上出现一个相应的图标,点击这个图标时,Launcher就会对应的应用程序启动起来。 Launcher的源代码工程在packages/apps/Launcher2目录下,负责启动其它应用程序的源代码实现在src/com/android/launcher2/Launcher.java文件中: view plaincopy to clipboardprint? 1./** 2.* Default launcher application. 3.*/ 4.public final class Launcher extends Activity 5. implements View.OnClickListener, OnLongClickListener, LauncherMod el.Callbacks, AllAppsView.Watcher { 6. 7. ...... 8. 9. /** 10. * Launches the intent referred by the clicked shortcut. 11. * 12. * @param v The view representing the clicked shortcut. 13. */ 14. public void onClick(View v) { 15. Object tag = v.getTag(); 16. if (tag instanceof ShortcutInfo) { 17. // Open shortcut 18. final Intent intent = ((ShortcutInfo) tag).intent; 19. int[] pos = new int[2]; 20. v.getLocationOnScreen(pos); 21. intent.setSourceBounds(new Rect(pos[0], pos[1], 22. pos[0] + v.getWidth(), pos[1] + v.getHeight())); 23. startActivitySafely(intent, tag); 24. } else if (tag instanceof FolderInfo) { 25. ...... 26. } else if (v == mHandleView) {

Android锁屏与解屏相关代码分析

我觉得对于普通人来说,最常见的是Android解屏的界面,然后应该是Home 界面。今天就来分析一下解屏界面的相关代码(以索爱的解锁界面为例)。 首先看解屏的界面,我把解屏的界面分为两个部分,最上部是status Bar,下面是LockScreenSemc,在LockScreenSemc上有一个可供滑动解锁的界面,每个界面对应的类如图所示。

两个类所在包: com.Android.internal.policy.impl.LockScreenSemc.java com.Android.internal.widget.SlidingTabSemc.java SlidingTabSemc.java分析: 分析我们的Touch在SlidingTabSemc 上产生的效果,主要看onTouchEvent ()的处理。 ACTION_DOWN 时会调用disableButtonPress(),产生手指点击时的动画效果。 ACTION_MOVE 时会调用moveControl()产生图片跟随手指移动的效果。 ACTION_UP 时会判断移动的位置是否已经到了,可以触发Trigger的程度,如果到了,则调用dispatchTriggerEvent,通知在SlidingTabSemc上的Trigger Listener。由于SlidingTabSemc上的Trigger Listener是在LockScreenSemc里实现的,所以会代用到LockScreenSemc中。

LockScreenSemc.java分析: 代码中有一行:private SlidingTabSemc mSelector; 将SlidingTabSemc 作为它的一个属性值, 另外此类实现了SlidingTabSemc.OnTriggerListener。这个listener用来执行我们从左到右或者从右到左的滑动,在构造函数中有 mSelector.setOnTriggerListener(this);这样我们在SlidingTabSemc上的滑动会调用到public void onTrigger(View v, int whichHandle)方法中。 onTrigger的执行为两个分支,一个为从右滑向左,执行了mAudioManager.setRingerMode(),设置了声音的模式,并更新右边声音的图片。另一个为从左滑向右,执行的是mCallback.goToUnlockScreen();这个mCallback 是何方神圣呢?它是KeyguardScreenCallback类型,并且在LockScreenSemc初始化的时候传进来的,跟踪后我们发现,LockScreenSemc是类LockPatternKeyguardView的一个属性值(private View mLockScreen);KeyguardScreenCallback的实现在LockPatternKeyguardView中。 LockPatternKeyguardView中LockPatternKeyguardView的逻辑是,如果用户在设置->位置和安全->设置屏幕锁定中设置了解锁画面,则调用了updateScreen(Mode.UnlockScreen)进入相应的解锁画面,否则调用:getCallback().keyguardDone(true); 这个getCallback() 返回的是KeyguardViewMediator。 KeyguardViewMediator 中keyguardDone()方法,最终会给Handler发送KEYGUARD_DONE 的消息,Handler会执行handleKeyguardDone()方法,在方法中会调用handleHide(),这个函数会将我们的LockScreenSemc给隐藏。 总结:总体来说,上面提到的类基本上可以这么认为,SlidingTabSemc属于LockScreenSemc,LockScreenSemc属于LockPatternKeyguardView, LockPatternKeyguardView 属于KeyguardViewManager,KeyguardViewManager 来统管所有与锁解屏相关的操作,另外通过KeyguardViewMediator,来实现KeyguardViewManager和PhoneWindowManager之间的交互与通信,如图所示: 画面的更新实现

相关主题
文本预览
相关文档 最新文档