Android应用基础知识

最近一直在阅读Android开发者网站的API Guide,眼睛看见的知识终归浅薄,现将知识点记录下来并付诸实践,以供日后翻阅。
  Android采用Java语言编写,Android的SDK开发工具将我们Java源代码及资源文件等生成可供用户下载安装的APK(Android application package),即.apk文件。安装到设备后,每个 Android 应用都运行在自己的安全沙箱内。
  我们知道,Android系统是构筑在Linux系统之上的,Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户,每个进程都具有自己的虚拟机,因此应用代码是在与其他应用隔离的环境中运行,如需访问其他应用的资源,可以与其他应用共享同一 Linux 用户 ID,或者获取相关访问权限。Android的权限访问机制大大增加了Android系统的安全性。

Android应用基础知识_第1张图片
Android系统架构图

一、应用组件

应用组件是 Android 应用的基本构建基块,共有四种不同的应用组件类型。每种类型都服务于不同的目的,并且具有不同生命周期。Android中共有四种不同类型组件:

(1)Activity

Activity表示具有用户界面的单一屏幕。我们对一个应用最直观的感受就体现在Activity上,它是用户可以直接看到的展示界面,每一个Activity都是独立存在的。

(2)Service

Service(服务)是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。 服务不提供用户界面,相当于一个默默无闻的工作者,例如,我们后台播放音乐以及文件的上传下载,都依靠Service来实现。

(3)ContentProvider

ContentProvider(内容提供程序)管理一组共享的应用数据。我们可以将数据存储在文件系统、SQLite 数据库、网络上或应用可以访问的任何其他永久性存储位置。 其他应用可以通过内容提供程序查询数据,甚至修改数据(如果内容提供程序允许)。例如,我们访问系统通讯录数据,也是通过内容提供器的接口来实现,但必须具有相应的访问权限。

(4)BroadcastReceiver

BroadcastReceiver(广播接收器)是一种用于响应系统范围广播通知的组件。很多时候我们的应用需要接收一些通知来进行相应的处理,例如 ,锁屏、电量不足、短信到来等广播,这些广播一般由系统发出来通知应用。应用也可以发起广播 ,例如,通知其他应用某些数据已下载完成,并且可供其使用。 虽然广播接收器不会显示用户界面,但它们可以创建状态栏通知,在发生广播事件时提醒用户。

二、启动组件

前面所说的Android系统基于Linux系统设计,每个应用都运行在单独的进程中,是不是意味着应用的组件不能跨进程调用?然而并非如此,Android 系统设计的独特之处在于,任何应用都可以启动其他应用的组件,这涉及到Intent和Intent过滤器的使用,详情可以参阅我的另一篇文章:Intent 和 Intent 过滤器。
  每种类型的组件都有不同的启动方法:

(1)Activity
  • 通过将Intent传递到startActivity()来启动Activity
  • 通过将Intent传递到startActivityForResult()来启动 Activity,此方法可获得被启动的Activity 返回的结果
(2)Service
  • 通过将Intent传递到startService()来启动Service,此方法启动该Service的组件与被启动的Service并无关联
  • 通过将Intent传递到bindService()来绑定该Service,此方法绑定该Service的组件能够控制被绑定Service的生命周期,并且能够与之交互并进行进程间通信(IPC)
(3)BroadcastReceiver
  • 通过将Intent传递到sendBroadcast()来发起广播,所有监听该广播的广播接收器都能收到该广播
  • 通过将Intent传递到sendOrderedBroadcast()来发起广播,按照广播接收器的优先级顺序接收广播
  • 通过将Intent传递到sendStickyBroadcast()来发起广播,发出的广播会一直滞留(等待),一旦有人注册相应广播接收器后能尽快的收到这条广播。
(4)ContentProvider

与前三类组件不同,Intent 不会启动内容提供程序,而是通过在 ContentResolver上调用 query()来对内容提供程序执行查询。

三、清单文件(AndroidManifest.xml)

清单文件在整个应用程序中起到一个非常重要的配置作用,应用程序需要用到的相关内容都需要在清单文件中先注册,清单文件的作用有很多,下面列出主要的几种:

(1)声明应用组件

在 Android 系统启动应用组件之前,系统必须通过读取应用的 AndroidManifest.xml
文件确认组件存在。因此,所有组件都必须在清单文件中注册,清单文件的主要任务是告知系统有关应用组件的信息,这样才能让系统找到对应的组件。例如,可以在清单文件中这样声明 Activity:



    
                
               
 ...   
    

其中,Activity 使用元素声明,服务使用元素声明,广播接收器使用元素声明,内容提供器使用元素声明。
  值得一提的是,广播接收器不是必须在清单文件中注册的,它还可以通过在java文件中动态注册来实现----动态创建(BroadcastReceiver对象)并且通过调用registerReceiver()注册到系统中。

(2)声明用户权限

应用运行时需要获得许多相关权限,如互联网访问权限或对用户联系人的读取权限等,这些需要用到的权限必须在清单文件中声明。例如,在清单文件中声明网络访问权限,如下:



    
    
 ... 
    

(3)声明应用要求

由于市场上基于 Android 系统的设备多种多样,并非所有设备都提供相同的特性和功能。 因此,为防止将应用安装在缺少应用所需特性的设备上,必须通过在清单文件中声明设备和软件要求,为应用支持的设备类型明确定义一个配置文件。
  其中的大多数声明只是为了提供信息,系统不会读取它们,但 Google Play 等外部服务会读取它们,以便当用户在其设备中搜索应用时为用户提供过滤功能。

  • 声明应用所需的最低API级别:
    ----使用元素,属性android:minSdkVersion指定能够运行应用的最低 API 级别。
  • 声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕:
    ----使用元素,用于描述应用程序所依赖的、重要的、可用的设备功能。

例如,如果您的应用需要相机,并使用 Android 2.1(API 级别7)中引入的 API,应该像下面这样在清单文件中以要求形式声明这些信息:

  
      
    
   ...

现在,没有相机且 Android 版本低于2.1 的设备将无法从应用市场上安装该应用。不过,也可以声明应用使用相机,但并不要求必须使用。 在这种情况下,应用必将 required属性设置为 "false",并在运行时检查设备是否具有相机,然后根据需要停用任何相机功能。

(4)声明应用需要链接的 API 库

很多时候,我们需要将第三方API引入我们的应用作为服务来供我们使用,如 Google 地图库,此时也需要向清单文件来声明我们应用需要链接的API库,如下所示:

  
  ...  
  

其中“YOUR_API_KEY”代表获得的 API 密钥,要使用 Google Places API ,必须向应用添加 Google API 密钥。

四、应用资源

Android 应用并非只包含代码,它还需要与源代码分离的资源,如图像、音频文件以及任何与应用的视觉呈现有关的内容。如下图所示,一个Android项目除了java文件、AndroidManifest.xml文件以外,res文件夹所代表的资源文件也占了很大一部分。

Android应用基础知识_第2张图片
Android项目主要结构

  提供与源代码分离的资源的其中一个最重要优点在于,我们可以提供针对不同设备配置的备用资源。使用应用资源能够在不修改代码的情况下轻松地更新应用的各种特性,并可通过提供备用资源集让我们能够针对各种设备配置(如不同的语言和屏幕尺寸)来优化我们的应用。

你可能感兴趣的:(Android应用基础知识)