Android学习01

本文介绍了Android安装文件的组成,详细解析了Android应用工程文件的结构,包括src、AndroidLibrary、assets、res等目录的作用,并深入探讨了AndroidManifest.xml文件的组成部分及其作用。此外,还概述了Android应用程序的生命周期及不同组件如何影响这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android学习01

简析Android安装文件

当我们下载并安装Android后,会在其安装目录中看到一些安装文件。

  • add-ons: 里面包含了官方提供的API包,最为主要的是Map的API。
  • docs: 里面包含了文档,即帮助文档和说明文档。
  • platforms: 针对每个版本的SDK版本提供了和其对应的API包以及一些示例文件,其中包含了各个版本的Android。
  • temp: 里面包含了一些常用的文件模板。
  • tools: 包含了一些通用的工具文件。
  • usb_driver: 包含了AMD64和X86下的驱动文件。
  • SDK Setup.exe: Android的启动文件。

Android体系结构介绍

Android作为一个移动设备的平台,其软件层次结构包括操作系统(OS)、中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下4层。

(1)操作系统层(OS)

(2) 各种库(Libraries) 和 Android 运行环境(RunTime)。

(3) 应用程序框架(Application Framework)。

(4) 应用程序(Application)。

一个基本的Android 应用程序可以利用应用程序框架中的以下五个部分:

  • Activity(活动)
  • Broadcast Intent Receiver(广播意图 接收者)
  • Service(服务)
  • Content Provider(内容提供者)
  • Intent and Intent Filter(意图和意图过滤器)

Android应用工程文件组成

Android的应用工程文件 主要由以下部分组成:

  • src文件:项目源文件都保存在这个目录里面。
  • Android Library: 这个是应用运行的Android库。
  • assets目录:里面主要放置多媒体等一些文件。
  • res目录:里面主要放置应用会用到的资源文件。
  • drawable目录:主要放置应用会用到的图片资源。
  • layout目录:主要放置用到的布局文件。这些布局文件都是XML文件。
  • values目录:主要放置字符串(strings.xml)、颜色(colors.xml)、数组(arrays.xml)。
  • Androidmanifest.xml:相当于应用的配置文件。在这个文件里面,必须声明应用的名称,应用所用到的Activity,Service以及receiver等。

AndroidManifest.xml文件

intent-filters描述了Activity启动的位置和时间。每当一个Activity(或者操作系统)要执行一个操作时,它将创建出一个Intent的对象,这个Intent对象能承载的信息可描述用户想做什么,用户向处理什么数据,数据的类型,以及一些其他信息。而Android则会和每个Application所暴露的intent-filter的数据进行比较,找到最合适Activity来处理调用者所指定的数据和操作。下面来仔细分析 AndroidMainfest.xml文件:

参数说明
manifest根节点,描述了package中所有的内容
xmlns:android包含命令空间的声明。xmlns:android=http://schemas.android.com/apk/res/android,使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据
Package声明应用程序包
application包含package中application级别组件声明的根节点。此元素也可包含application的一些全局和默认的属性,如标签、icon、主题、必要的权限等。一个mainfest能包含零个或一个此元素(不能大于一个)
android:icon应用程序图标
android:label应用程序名字
Activity用来与用户交互的主要工具。Activity是用户打开一个应用程序的初始页面,大部分被使用到的其他页面也由不同的activity所实现,并声明在另外的activity标记中。注意,每一个activity必须有一个<activity>标记对应,无论它给外部使用或是只用于自己的package中。如果一个activity没有对应的标记,用户将不能运行它。另外,为了支持运行时查找activity,可包含一个或多个 <intent-filter> 元素来描述activity所支持的操作
android:name应用程序默认启动的activity
intent-filter声明了指定的一组组件支持的Intent值,从而形成了Intent Filter。除了能在此元素下指定不同类型的值,属性也能放在这里来描述一个操作所需的唯一的标签、icon和其他信息
action组件支持的Intent action
category组件支持的Intent Category。这里指定了应用程序默认启动的activity
uses-sdk该应用程序所使用的sdk版本相关

应用程序的生命周期

程序也如自然界的生物一样,有自己的生命周期。应用程序的生命周期即程序的存活时间,即在什么时间内有效。Android是一构建在Linux之上的开源移动平台,在Android中,多数情况下每个程序都是在各自独立的Linux进程中运行的。当一个程序或其某些部分被请求时,它的进程就 “出生” 了;当这个程序没有必要再运行下去且系统要回收这个进程的内存用于其他程序时,这个进程 "死亡”了。可以看出,Android程序的生命周期是由系统控制而非程序自身直接控制。这和我们编写桌面应用程序时的思维有些不同,一个桌面应用程序的进程也是在其他进程或用户请求时被创建,但是往往是在在程序自身收到关闭请求后执行一个特定的动作(比如从main函数中返回)而导致进程结束的。要想做好某种类型的程序或者某种平台下的程序的开发,最关键的是就是要弄清楚这种类型的程序或整个平台下的程序的一般工作模式并熟记于心。在Android中,程序的生命周期控制就属于这个范畴。

开发者必须理解不同的应用程序组件,尤其是 Activity、Service 和 Intent Receiver。了解这些组件是如何影响应用程序的生命周期的,这非常重要。如果不正确使用这些组件,可能会导致系统正在执行重要任务的应用程序进程。

一个常见的进程生命周期漏洞的例子是 Intent Receiver(意图接受器),当 Intent Receiver 在 onReceive 方法中接受到一个 Intent(意图)时,它会启动一个线程,然后返回。一旦返回,系统将认为 Intent Receiver 不再处于活动状态;因而 Intent Receiver 所在的进程也就不再有用了(除非该进程中还有其他的组件处于活动状态)。因此,系统可能会在任意时刻终止该进程以回收占用的内存。这样进程中创建出的哪个进程也将被终止。解决这个问题的方法是从 Intent Receiver 中启动一个服务,让系统知道进程中还有处于活动状态的工作。为了使系统能够正确决定在内存不足时应该终止哪个进程,Android根据每个进程中运行的组件及组件的状态把进程放入一个 "Importance Hierachy(重要性分级)"中。进程的类型按重要程度排序。

1. 前台进程(Foreground)

与用户当前正在做的事情密切相关。不同的应用程序组件能够通过不同的方法将它的宿主进程移到前台。在如下的任何一个条件下:进程正在屏幕的最前端运行一个与用户交互的活动(Activity),它的 onRescue方法被调用;或进程有一个服务(Service),并且在服务的某个回调函数(Service.onCreate、Service.onStart或Service.onDestroy)内正在执行的代码,系统将把进程移动到前台。

2. 可见进程(Visible)

它有一个可以被用户从屏幕上看到的活动,但不在前台(它的 onPause 方法被调用)。例如,如果前台的活动是一个对话框,以前的活动就隐藏在对话框之后,就会出现这种进程。可见进程非常重要。一般不允许被终止,除非是为了保证前台进程的运行而不得不终止它。

3. 服务进程(Service)

拥有一个已经用 startService 方法启动的服务。虽然用户无法直接看到这些进程,但它们做的事情却是用户关心的(如后台MP3回放或后台网络数据的上传、下载)。因此,系统将一直运行这些进程,除非内存不足以维持所有的前台进程可可见 进程。

4. 后台进程(Background)

拥有一个当前用户看不到的活动(它的 onStop方法被调用)。这些进程对用户体验没有直接的影响。如果它们正确执行了活动生命周期,系统可以在任意时刻终止该进程以回收内存,并提供给前面三种类型的进程使用。系统中通常有很多这样的进程在运行,因此,要将这些进程保存在 LRU 列表中,以确保当内存不足时用户最近看到的进程最后一个被终止。

5. 空进程(Empty)

不拥有任何活动的应用程序组件的进程。保留这种进程的唯一原因是在下次应用程序的某个组件需要运行时,不需要重新创建进程,这样可以提高启动速度。

系统将以进程中当前处于活动状态组件的重要程度为基础对进程进行分类。进程的优先级可能也会根据该进程与其他进程的依赖关系而增长。例如:如果进程A通过在进程B中设置 Context.BIND_AUTO_CREATE 标记或使用 ContenProvider 被绑定到一个服务(Service),那么进程B在分类时至少要被看成与进程A同等重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值