Android 应用基础知识

本文是这篇文章的精简版:安卓官方教程 - 应用基础知识

安全沙箱

为什么各个应用之间是无法互相访问文件的?VM和linux进程之间有什么关系?

  • 每个应用分配一个用户,设置一个user id,这个id应用自己并不知道。
  • 默认情况,用user id给应用的文件设置权限,只有本应用才能使用这些文件。
  • 每个应用运行在单独的虚拟机中,与其他应用是隔离开的。
  • 默认情况,每个应用运行在自己的linux进程中,当安卓系统需要启动应用的某些组件时启动进程。
  • 一个进程一个虚拟机,从底层讲,所有应用的进程,也就是所有的虚拟机进程都是zygote进程fork出来的进程。
  • 一个应用可以有多个进程。按组件划分进程,每个组件可以定义自己运行的进程。默认情况是所有组件在同一个进程内运行。

如何共享:

  • 两个应用可以使用同样的user id,使文件可以互相访问。还可以运行在相同的进程(虚拟机)中,需要有相同的user id,相同的签名。
  • 使用系统服务,一般需要申请权限来使用,例如联系人数据、外部存储设备等。

四大组件

  • Activity:具有用户界面的单一屏幕
  • Service:执行后台运行的任务,没有界面
  • ContentProvider:管理共享的数据,提供读取和修改的接口
  • BroadcastReceiver:响应系统范围广播的组件

安卓是一个开放的系统,任何应用都可以启动其他应用的组件。虽然能启动其他应用的组件,但每个应用的组件还是运行在应用自己的进程中或者指定的进程中,而不是运行在启动它的应用的进程中。

因为安全沙箱的存在,无法直接启动另一个应用的组件,而是需要通过系统来做中间人,因此启动其他组件也就是向系统发送一个“我要启动其他应用的组件”的消息。这种消息是一种异步消息,称为Intent。

启动组件

四大组件中的Activity、Service、BroadcastReceiver都要通过Intent启动,ContentProvider的启动比较直接,使用者使用ContentResolver来直接控制ContentProvider的启动,ContentResolver也是一个中间层用来隔离使用者和ContentProvider。

Intent是一种异步消息,它代表一种“意图”,也就是这个英文单词的含义。可以是显示的意图也可以是隐式的意图。显示的例子:想要启动某个指定名字的Activity或者某个Service,隐式的例子:想要让系统播放一个视频文件,如何打开可以由系统查找能打开的应用,而不是直接指定某个应用的某个组件。

清单文件

清单文件的作用和内容

  • 声明组件,除了动态定义的BroadcastReceiver,其他类型的组件都需要在清单文件中声明。
  • 声明应用要用到的权限
  • 声明最低API级别,这个也可以放在gradle中声明
  • 声明需要用到的硬件或软件feature,有些设备可能不支持,可以通过这个设置在应用市场上过滤掉不支持的设备,不支持的设备无法看到或无法下载安装必须使用这个feature的应用。也可以声明为不强制需要,然后在运行时检查来决定使不使用,这时就不会有过滤行为。
  • 声明 Intent Filter,响应隐式Intent的组件需要定义Intent Filter,它能描述意图的本意而不指定意图处理的对象。如果系统中有多个应用的多个组件使用了相同的IntentFilter,那么回让用户来选择使用哪个来处理Intent。

应用资源

一个应用并不仅仅包括代码,还包括图片、布局等资源。资源不依赖代码,可以替换资源而不需要修改代码。

不同的设备配置各不相同,使用备用资源可以针对各种不同的配置(不同的语言和屏幕尺寸)来优化应用。使用限定符可以指定一个资源文件夹是专门用来存放不同限定符指定的不同配置时使用的资源。资源限定符有很多种,是一些很短的字符串,可以使用一个限定符也可以同时使用多个应用到资源目录。

对一个资源,安卓的构建工具会在编译期生成一个唯一的整数id,可以用这个id来引用这个资源。

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