当前位置: 首页 > 科技观察

Android新手必看:浅析应用程序基本原理

时间:2023-03-13 04:25:30 科技观察

ApplicationFundamentals-应用程序基础Android应用程序使用java作为开发语言。利用AndroidSDK提供的工具,可以将应用程序所需的数据和资源文件打包成一个android包文件,以.apk为扩展名。所有代码都在一个.apk文件中,作为应用程序,此文件通常安装在Android设备上。一旦安装在设备上,每个应用程序都位于自己的安全沙箱中。Android系统是一个多用户的Linux系统,其中每个应用程序都是不同的用户。默认情况下,系统会为每个应用程序分配一个独立的Linux用户ID(这个ID仅供系统使用,对应用程序是不可知的),系统会为一个应用程序中的所有文件设置权限,因此只有应用程序分配了该用户ID可以访问它们。每个进程都有自己的虚拟机,因此一个应用程序代码的执行与其他应用程序代码的运行是隔离的。默认情况下,每个应用程序都在其自己的虚拟机中运行。在Linux进程中。Android在应用程序中的任意代码开始执行时启动一个进程,并在不再需要该进程且其他应用程序需要系统资源时关闭该进程。这样,Android系统就实现了最小权限原则。默认情况下,每个应用程序只访问需要工作的组件,而不会做其他事情。这创建了一个非常安全的环境,应用程序无法访问它们未被授权访问的系统的其他部分。但是,应用程序可以通过多种方式与其他应用程序共享数据和访问系统服务:可以安排两个应用程序共享一个linux用户ID,在这种情况下,它们可以访问彼此的数据。为了节省系统资源,具有相同用户ID的应用程序也可能被安排在同一个Linux进程中运行并共享同一个VM(应用程序必须签署相同的证书)。所有应用程序都可以请求访问硬件数据的权限,例如用户联系人、短信和可挂载存储设备(SD卡)、相机、蓝牙等,并且必须在用户安装它们时授予所有应用程序权限。以上描述了与应用程序如何存在于系统中相关的基本概念。本文档的其余部分将向您介绍以下内容:在清单中定义您的应用程序中的核心框架组件,并为您的应用程序声明组件和设备特性。独立于应用程序代码请求资源允许您的应用程序极大地优化其在各种配置设备上的性能。ApplicationComponents-ApplicationComponents应用组件是构建Android应用的关键和基石。每个组件都是一个独特的入口点,系统可以从中进入您的应用程序。并非每个组件都是用户的实际入口点,但它们之间存在一些依赖关系。但是每个存在的组件都有自己的入口点并扮演着特定的角色——每个组件都是独特的构建块,可帮助您定义应用程序的整体行为。有四种不同类型的应用程序组件,每一种都有不同的用途,并且有不同的生命周期,定义了如何创建和销毁它。下面是四个应用程序组件:活动屏幕上显示用户界面的活动。例如,电子邮件应用程序可能有一个显示新电子邮件列表的活动。另一个活动是用来写的还有一个活动是用来读邮件的。尽管这些活动在电子邮件应用程序中协同工作以形成完整的用户体验,但每个部分都是相互独立的。正因为如此,不同的应用程序可以启动这些活动。任何一个(例如电子邮件应用程序允许的)。例如,相机应用程序可以在电子邮件应用程序中启动一个活动来编写新电子邮件,从而允许用户共享照片。活动作为Activity的子类实现,在活动开发指南中,您可以使用服务了解更多信息。服务是长期在后台运行,执行操作,甚至可以为远程进程工作的组件。服务不提供用户界面。例如,当用户在其他应用程序中时,某个服务可能会在后台播放音乐,或者在后台获取数据,这些都不会影响用户与其他活动的交互。其他组件,比如一个activity,可以启动一个service让其运行或者绑定到这个activity上与之交互。服务作为服务子类实现。您可以在服务开发指南中了解更多信息。使用内容提供者Content提供内容提供者来管理共享应用程序数据集。您可以将数据存储在文件系统、SQLite数据库、在线或您的应用程序可以访问的持久存储中。通过内容提供者,其他应用程序可以查询甚至修改数据(如果内容提供者允许的话)。例如Android系统提供了一个contentprovider来管理用户通讯录信息。因此,任何具有适当权限的应用程序都可以查询内容提供者的部分(例如ContactsContract.Data)来读写关于一个人的信息。内容提及提供程序对于读取和写入您的应用程序私有的非共享数据也很有用,例如记事本示例应用程序,它使用内容提供程序来存储笔记。内容提供者被认为是ContentProvider的子类实现,必须实现一组标准的API,以便其他应用程序可以执行交换操作。更多信息请参阅内容提供者开发指南。广播接收器广播接收器是对系统范围广播公告(通知)的响应。许多广播消息源自系统,例如屏幕关闭、电池电量低或已捕获图片的通知。应用程序还可以发起广播,例如,让其他应用程序知道一些数据已经下载到设备,它们可以使用了。尽管广播接收器无法显示用户界面,但它们可以创建一个状态通知器,在广播事件发生时提醒用户。但在更多情况下,广播接收器只是另一个组件,它希望为某个事件做最少的“网关”(途径)。例如,它可能会启动一个服务来对某个事件执行一些工作。广播接收器是作为BroadcastReceiver子类实现的。每个广播接收器都有从Intent对象派生的。有关详细信息,请参阅BroadcastReceiver类。任何应用程序都可以启动另一个应用程序组件。这是Android系统设计独有的一个方面。例如,您想用设备的相机拍照。其他应用程序已经启用了此功能,您的应用程序无需自己开发相机活动即可使用它。您不需要合并(包含)甚至链接相机应用程序中的代码;相反,只需在应用程序中启动相机Activity,只需拍照即可。照片完成后,甚至可以将照片返回到您的应用程序,以便您可以使用它。对于用户来说,相机就像是你应用程序的一部分。当系统启动一个组件时,它会启动该应用程序的进程(如果该应用程序未运行),并实例化该组件所需的类。例如,如果您的应用程序启动相机应用程序的一个活动来拍照。此活动将在属于相机应用程序的进程中运行,而不是在您的应用程序的进程中运行。因此,与大多数其他系统应用程序不同,Android应用程序没有单一的入口点(例如,没有main()函数)。因为系统上运行的每个应用程序都在一个单独的进程中,具有文件权限,这就限制了对其他应用程序的访问,你的应用程序不能直接访问其他应用程序。但是,安卓系统也可以激活其他应用程序的组件。您必须向系统传递一条消息,指定您要启动的组件,然后系统会为您激活该组件。激活组件-ActivatingComponents4组件这些组件中的三个——活动、服务和广播接收器——由称为意图的异步消息激活。在运行时,Intents将某些组件绑定到其他组件,而不管该组件是属于您的应用程序还是另一个应用程序(您可以将它们视为一条消息,用于请求另一个组件的动作)。Intent是由Intent创建的对象。该对象定义了特定组件的激活或对于特定组件类型的消息,意图可以是显式的或隐式的。对于活动和服务,意图定义要执行的操作(例如:“查看”或“发送”某物),并以URI格式指定要使用的数据(其中一些需要其他组件知道)开始)。例如,一个Intent可能会向Activity发送请求以显示图像或打开网页。在某些情况下,您启动Activity以接收结果。在这种情况下,活动将在Intent中返回一个结果。(例如,您可以指示一个意图让用户获取一个人的联系信息并将其返回给您。返回的意图将包含一个指向所选联系人的URI。)对于广播接收器,意图只是将公告定义为播送。(例如,声明设备电池电量低的广播只包含一个动作字符串,表示“电池电量低”)。它是另一个组件,内容提供者,不是由意图激活的。此外,它由内容解析器(ContentResolver)请求的目标激活。内容解析器处理与内容提供者的所有直接交换。因此组件不需要与提供者进行交换,而是调用ContentResolver对象方法。(这句话不太好理解)出于安全考虑,在组件请求信息和内容提供者之间有一个抽象层。以下是激活各种类型组件的几种方法:您可以通过将(或一些新的)Intent参数传递给startActivity()或startActivityForResult()(当您希望活动返回参数时)函数来启动活动().您可以将Intent传递给startService()方法(或向正在运行的服务提供新命令),或者您可以将Intent传递给bindService()方法以绑定到服务。您可以使用sendBroadcast()、sendOrderedBroadcast()或sendStickyBroadcast()三种方法来广播一个意图。您可以通过调用ContentResolver上的query()方法来查询内容提供者。有关使用意图的更多信息,请参阅意图和意图过滤器文档。在下面的文档中,也有一些关于激活某个组件Activity、Services、BroadcastReceiver和ContentProviders的信息。Manifest文件-TheManifestFile在Android系统启动一个应用程序组件之前,系统必须读取AndroidManifest.xml文件才能知道组件的存在。您的应用程序必须在此文件中声明其所有组件,并且它必须位于应用程序项目的根目录中。这个manifest文件除了声明组件之外,还处理了很多其他的事情,比如:指定应用请求其他权限,比如访问网络或者访问用户通讯录,声明应用需要的最低APILevel,使用哪个API通过应用程序,声明应用程序请求和使用的软件和硬件功能,例如相机,蓝牙服务,或多点触控触摸屏应用程序需要链接的API库,例如谷歌地图库等。声明组件-声明组件清单文件的主要任务是告诉系统,应用程序的组件,例如,清单可以声明这样的活动:...元素中,android:iconsp在元素中指定应用程序的图标资源,android:name属性指定Activity子类的全类名,android:label属性指定一个对用户可见的activity标签。您必须像这样声明所有应用程序组件:声明活动的元素声明声明服务的元素声明广播接收器元素的元素声明内容提供者元素代码中包含的活动、服务和内容提供者,如果未在中声明manifest,因为它对系统是不可见的,永远不会运行。但是,广播接收器可以在清单中声明,或者在代码中动态创建(作为BroadcastReceiver对象)并通过registerReceiver()方法向系统注册。要了解清单文件的详细构建过程,请参阅TheAndroidManifest.xmlFileDocumentDeclaringComponentCapabilities-Declaringcomponentcapabilities如上文ActivatingComponents中所述,您可以使用ActivatingComponents来启动活动、服务和广播接收器。您还可以在意图中明确指定目标组件(使用组件类名)。然而,意图的真正力量在于它的意图行动。(行动)。通过使用意图操作,您只需描述要执行的操作类型(以及与执行操作相关的数据(可选)),并允许系统在设备上找到一个组件,以便它可以执行该操作和启动它。如果有多个组件可以执行意图指定的动作,则用户选择执行哪一个。通过将设备上其他应用程序的清单文件上的意图过滤器与接收到的意图进行比较,系统确定哪个组件可以响应意图。当您在应用程序的清单中声明组件时,您可以选择包含意图过滤器以指定组件的功能,以便它可以响应来自其他应用程序的意图。您可以添加一个组件声明元素为您的组件声明一个意图过滤器的子元素。例如,在电子邮件应用程序中,创建电子邮件的活动可能会在其清单中声明一个意图过滤器以响应“发送”意图(以便发送电子邮件)。然后,在您应用程序的一个活动中,创建一个带有“发送”ACTION_SEND的意图。当您调用startActivity()方法启动Intent过滤器时,系统会将其与电子邮件应用程序的“发送”活动相匹配,并运行它。有关创建意图过滤器的更多信息,请参阅意图和意图过滤器文档。声明应用程序要求Android附带了许多设备,但它们并不提供所有相同的特性和功能。为避免拥有您的应用程序,请将其安装在不具备您的应用程序所需功能的设备上。通过在清单文件中声明软件和硬件要求来清楚地表明您的应用程序支持的硬件类型非常重要。大多数声明只是信息,系统不会读取它们,但AndroidMarket等其他服务会读取它们,以便用户在为他们的设备寻找应用程序时可以进行过滤。例如,如果您的应用需要摄像头并使用API2.1(API级别7),您应该在清单文件中声明这些要求。这样,那些没有摄像头且Android版本低于2.1的设备就无法安装您在Android市场上的应用程序。但是,您也可以声明您的应用程序使用camera,但这不是必需的。在这种情况下,您的应用程序必须在运行时执行检查以确定设备是否具有摄像头,如果没有则禁用与摄像头相关的功能。以下是您在设计和开发应用程序时必须考虑的一些重要设备特性。屏幕上像素的物理密度,或dpi-每英寸点数)。为了简化所有不同类型的屏幕配置,Android系统将它们分为可选组,以便更轻松地定位屏幕尺寸:小、普通、大和极端屏幕分辨率:低分辨率、中分辨率、高分辨率和超高分辨率默认情况下,你的app兼容所有的屏幕尺寸和Interpretive,因为Android系统会做适当的调整,让它适合你的UI布局和图片资源。但是,您应该为特定的屏幕尺寸创建特殊的布局,并为特定的解释提供特定的图像,在您的清单文件中使用可选资源和声明元素来明确指示您的应用程序支持的屏幕尺寸。有关详细信息,请参阅支持多屏幕文档输入配置输入配置许多设备提供不同类型的输入设备,例如,硬件键盘、轨迹球、五向导航板。如果您的应用程序必须需要特殊的输入硬件,那么您应该在应用程序中使用元素声明。然而,应用程序必须要求一个特殊的输入配置是非常罕见的。设备功能设备功能在装有Android的设备中,有许多硬件和软件功能,这些功能可能存在也可能不存在。诸如相机、光传感器、蓝牙或特定版本的OpenGL或触摸屏的精度之类的东西。您永远不应该假设某个功能在所有配备Android的设备上都可用(标准Android库除外),因此您应该使用元素来声明您的应用程序支持的功能。PlatformVersion不同平台版本的Android设备往往运行不同的Android平台版本,比如Android1.6或者2.3。每个成功的版本通常都包含在以前版本中的UnavailableAPIs。需要指出的是,有哪一组API可用,每个平台版本都指定了一个APILevel(例如,Android1.0是APILevel1,Android2.3是APILevel9)。如果你使用的是1.0以后的API,添加到platform,你应该用元素声明最低的API级别,它表示将使用哪些API。为您的应用程序声明所有必要的要求非常重要。因为,当您将应用程序发布到Android市场时。市场将使用这些声明来筛选出每个设备上可用的应用程序。同样,您的应用程序应该只能在满足您应用程序的所有要求的设备上使用。有关AndroidMarket如何根据这些要求进行过滤的更多信息是的,请参阅MarketFilters文档与应用程序的可显示图像相关。例如,您应该使用XML文件定义动画、菜单、样式、颜色和活动布局。使用应用程序资源可以让您的应用程序轻松升级各种功能,而无需修改任何代码——并通过提供一组可选择的资源——这可以优化您的应用程序在具有不同配置(例如不同语言和屏幕尺寸)的各种设备上的性能。对于您的Android项目中包含的每个资源,SDK会将其定义为一个唯一的整数ID,以便您可以在您的代码或XML文件中定义的其他资源中引用它。如果你的应用包含一张名为logo.png的图片(保存在res/drawable/目录下),SDK工具会生成一个名为R.drawable.logo的资源ID,你可以用它来引用图片并将它们插入到你的用户界面中.提供与代码分离的资源的一个非常重要的方面是使您可以为不同配置的设备提供可选资源。例如,通过在XML中定义UI字符串,可以将字符串翻译成各种语言,并保存在不同的文件中。然后,根据语言限定符,你可以添加资源目录名(如法语资源为res/values-fr/),以及用户语言设置,Android系统会将相应的资源应用到你的UI中。Android是你的可选资源并且支持许多不同的限定符(qualifiers)。限定符是一个包含在您的目录名称中的短字符串,用于定义将在配置设备上使用哪些资源。再举一个例子,由于设备屏幕的方向和大小不此外,您通常需要为您的活动定义不同的布局。例如,如果设备的屏幕是纵向(高),您可能需要带有垂直按钮的布局,而当屏幕是横向(宽)时,按钮应该水平对齐。要根据方向更改布局,您可以定义两个不同的布局并在布局的目录名称中使用相应的限定符。然后,系统会根据当前设备方向自动应用相应的布局。布局。