应用基础知识
- Android操作系统是一种多用户Linux系统,其中的每个Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
- 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
- 每个进程都具有自己的虚拟机 (VM),因此应用代码是在与其他应用隔离的环境中运行;
- 默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 会在需要执行任何应用组件时启动该进程,然后在不再需要该进程或系统必须为其他应用恢复内存时关闭该进程。
共享数据和访问系统服务
- 可以安排两个应用共享同一 Linux 用户 ID,在这种情况下,它们能够相互访问彼此的文件。 为了节省系统资源,可以安排具有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一 VM(应用还必须使用相同的证书签署)。
- 应用可以请求访问设备数据(如用户的联系人、短信、可装载存储装置 [SD 卡]、相机、蓝牙等)的权限。
应用组件
- Activity 标识具有用户界面的单一屏幕
- Service 一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业,不提供用户界面,不会阻断Acitivity与用户的交互
- ContentProvider 管理一组共享的应用数据,其他应用可以通过ContentProvider对数据进行读写操作
- BroadcastReceiver 响应系统范围广播通知的组件,不会显示用户界面,可以创建通知栏通知。更常见的用户只是作为通向其他组件的“通道”。
- 任何应用都可以启动其他应用的组件
- Android应用没有单一的入口点(没有main函数)
- 除了ContentProvider之外的三大组件通过Intent启动,ContentProvider是在成为ContentResolver的请求目标时启动
Manifest
- 四大组件只有BroadcastReceiver可以无需注册而动态创建
- Manifest可以描述托管应用组件的进程
- 只有<manifest>和<application>元素是必须的,它们必须有且只有一个;而且<application>必须是<manifest>元素内最后一个元
- 显式命名目标组件的intent将直接激活该组件,因此这种情况下的目标组件的<intent-filter>不起作用
- <permission>标签是声明他人调用本应用所需的权限,<uses-permission>是本应用运行需要向外部请求的权限
应用资源
- 资源应该“外部化”——将图片和代码中的字符串放到特定的资源目录,方便系统根据不同的设备配置和语言环境选择正确的资源
- 切勿将资源文件直接保存在res/目录内,否则会出现编译错误
- 资源的可以通过资源配置限定符来对文件夹进行命名以便根据配置动态选择不同配置下的资源
- 单组资源可以指定多个限定符,通过短划线分隔,如drawable-en-rUS-land
处理运行时变更
- 设备配置在运行时发生变化会触发Activity的销毁和重建,目的是通过新配置匹配相应的资源
- 重启Activity并恢复大量数据代价高,体验差,有两个选择
- 在配置变更期间保留对象(通过保留Fragment)
- 自行处理配置变更(manifest中配置configChanges,此后在配置变化时不会自动重启,而是调用onConfigurationChanged(Configuration newConfig),在此回调中自己处理)
本地化
- 如果命中了缺省配置,但缺省资源文件中不包含所需的资源(如字符串),会有运行时报错并FC
- 如果多套资源都被配置命中,会优先选择locale(有如下例外),如res/drawable-ja/优先于res/drawable-small-land-stylus/
Exception: The only qualifiers that take precedence over locale in the selection process are MCC and MNC (mobile country code and mobile network code
- 管理本地化字符串
- 把所有字符串都放到string.xml中,避免硬编码
应用权限
- 通过<uses-permission获取>,权限有两类:normal(不会对用户隐私和设备控制产生影响的)和dangerous,normal会在程序安装时由系统自动授予,dangerous会弹出请求窗
- 在Android6.0以上版本,dangerous权限都需要手动唤起请求窗来请求获得
- 组件可以通过android:permission声明所需权限,这样在调起组件的时候会检查调用者是否有对应的权限
- 权限组,如果应用已经有权限组中的一个dangerous权限,那么在应用请求统一权限组的另一个dangerous权限的时候不需要用户授权,直接可以获得
- 可以通过Intent来减少权限请求,例如拍照,可以通过系统intent让其他应用来完成而无需请求系统权限
- 系统不允许不同的package声明同名的permission,除非这些packages是同一个证书签名