1, 沙箱机制
Android 操作系统是一种多用户 Linux 系统, 系统会为每个应用分配一个唯一的 Linux 用户 ID, 再为应用中的所有文件设置权限, 使得只有拥有这个 ID 的应用才能访问这些文件.
每个进程都有自己的 VM 环境, 每个应用都在自己的进程中执行, 与其他应用进行隔离. 默认情况下, 每个应用都只能访问执行其工作所需的组件, 而不能访问其他组件.
可以安排两个应用共享同一个 Linux 用户 ID. 在这种情况下, 他们能够互相访问彼此的文件.
2, 应用组件
应用组件是 Android 应用的基本构建基块. 每个组件都是一个不同的点, 系统可以通过它进入您的应用. 并非所有组件都是用户的实际入口点, 有些组件相互依赖, 但每个组件都以独立实体形式存在, 并发挥特定作用 - 每个组件都是唯一的构建基块, 有助于定义应用的总体行为. 共有四种不同的应用组件类型. 每种类型都服务于不同的目的, 并且具有定义组件的创建和销毁方式的不同生命周期.
Activity: 表示具有用户界面的单一屏幕. 最常用的.
Service: 服务. 是一种在后台运行的组件, 用于执行长时间运行的操作或为远程进程执行作业. 服务不提供用户界面. 使用场景不多, 一般有音乐服务等.
ContentProvider: 内容提供程序管理一组共享的应用数据. 可以将数据存储在文件系统, SQLite 数据库, 网络上或应用可以访问的任何其他永久性存储位置. 其他应用可以通过内容提供程序查询数据, 甚至修改数据 (如果内容提供程序允许).
BroadcastReceiver: 广播接收器是一种用于响应系统范围广播通知的组件.
任何应用都可以启动其他应用的组件 (隐式启动).
当系统启动某个组件时, 会启动该应用的进程 (如果尚未运行), 并实例化该组件所需的类.
Android 应用没有单一的入口点, 比如没有 main() 函数.
启动组件
Activity,Service,BroadcastRecevier 通过 Intent 进行启动, 可以将各个组件进行相互绑定, 包括其他应用的组件. Intent 定义了用于启动特定组件或者特定类型的组件, 可以是显示的, 也可以是隐式的.
ContentProvide 不会被 Intent 启动. 会在成为 ContentResolver 的请求目标时启动. 内容解析程序通过内容提供程序处理所有直接事务, 使得通过提供程序执行事务的组件可以无需执行事务, 而是改为在 ContentResolver 对象上调用方法. 这会在内容提供程序与请求信息的组件之间留出一个抽象层 (以确保安全).
Activity: 可以通过 Intent 传递到 startAcivity() 或者 startActivityForResult() 来启动.
Service: 可以通过 Intent 传递到 startService 或者 bindService() 来启动或者绑定该服务.
BroadcastReceiver: 可以将 Intent 传递到 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast() 来发起广播.
ContentProvider: 调用 query() 对内容提供程序执行查询.
3,AndroidManifest.xml 文件
系统启动应用组件之前, 必须通过读取应用的 AndroidManifest.xml 文件确定组件存在 (BroadcastReceiver 可以在 AndroidManifest.xml 文件声明, 也可以在代码中动态创建并通过调用 registerReceiver() 在系统中注册.). 组件必须在文件中申明, 文件必须存在项目的的根目录中.
声明组件的功能
通过在 AndroidManifest.xml 文件中为组件设置一些 Intent-filter 下的规则, 隐式启动时, 遍历手机中所有的组件, 寻找符合规则的进行启动, 如果存在多个结果, 则弹出弹框, 让用户自己选择.
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:Android="http://schemas.android.com/apk/res/android"
- package="com.example.zhangchao.test">
- <application
- Android:allowBackup="true"
- Android:icon="@mipmap/ic_launcher"
- Android:label="@string/app_name"
- Android:roundIcon="@mipmap/ic_launcher_round"
- Android:supportsRtl="true"
- Android:theme="@style/AppTheme">
- <!-- 应用的入口 activity-->
- <activity Android:name=".MainActivity">
- <!-- 过滤规则, 可以有其他的规则 -->
- <intent-filter>
- <action Android:name="android.intent.action.MAIN" />
- <category Android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <!-- 声明一个 MyActivity-->
- <activity Android:name=".MyActivity"/>
- <!-- 声明一个 MyService-->
- <service Android:name=".MyService"/>
- <!-- 声明一个 BroadcastReceiver-->
- <receiver Android:name=".MyBroadcastReceiver"/>
- <!-- 声明一个 ContentProvider,authorities 是指定的 uri,name 是 Android 指定的类 -->
- <provider
- Android:authorities="" Android:name=""/>
- </application>
- <!-- 申请获得访问网络的权限 -->
- <uses-permission Android:name="android.permission.INTERNET"/>
- </manifest>
4, 应用资源
应用资源是指应用中与源代码分离的资源, 如图像, 音频文件以及任何与应用的视觉呈现有关的内容. 在 Android 项目中的每一项资源, SDK 构建工具都会定义一个唯一的整形 ID, 可以通过 ID 对资源进行应用. 提供与源代码分离的资源的其中一个最重要优点在于, 您可以提供针对不同设备配置的备用资源.
项目 res / 目录下支持的资源目录
目录 | 资源类型 |
---|---|
animator/ | 定义属性动画的 xml 文件 |
anim/ | 定义渐变动画的 XML 文件 |
color/ | 定义颜色状态列表的 XML 文件 |
drawable/ | 位图文件(.png、.9.png、.jpg、.gif) |
values/ | 包含字符串、整型数和颜色等简单值的 XML 文件。 |
mipmap/ | 适用于不同启动器图标密度的可绘制对象文件。 |
layout/ | 用于定义用户界面布局的 XML 文件 |
menu/ | 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。 |
raw/ | 要以原始形式保存的任意文件,要以原始的 InputStream 打开这些资源 |
xml/ | 可以在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处 |
values / 目录下的资源
其他 res/ 子目录中的 xml 资源文件是根据 xml 文件名定义单个资源, 而 values/ 目录中的文件可描述多个资源. 对于此目录中的文件,<resources> 元素的每个子元素均定义一个资源. 例如,<string> 元素创建 R.string 资源,<color> 元素创建 R.color 资源.
目录 | 资源类型 |
---|---|
arrays.xml | 用于资源数组(类型化数组) |
color.xml | 颜色值 |
dimens.xml | 尺寸值 |
string.xml | 字符串值 |
styles.xml | 样式 |
来源: http://www.jianshu.com/p/9c8771dee957