安卓app运行机制:(google 官方文档提取)
一、app在系统中是怎样存在的
1. 安装apk(运行在各自的沙盒中)
1.1 因为安卓是一个多用户的Linux系统,所以每个app就相 当于一个不同的用户
1.2 每个app,系统都会给它一个独特的ID,然后分配不同的权限给app
1.3 每个进程,都会拥有自己的虚拟机(virtual machine), 所以每个app的代码都是独立于其他app运行的
1.4 默认情况下,每个app都在自己的Linux进程上运行。当程序的组件运行时,Android系统就会启动这个进程,当程序被关闭,或者Android系统内存不足的情况下,会关闭这个进程
2. 通过以上描述,发现每个Android app都是独立运行的,无法跨越自己的权限访问。但是,Android系统提供了让app之间分享数据以及访问系统服务的方法
2.1 两个不同的app是有方法共享一个Linux用户ID的,因此,他们能够相互访问各自的文件。为了节约系统资源,两个拥有相同用户ID的app也能够被安排运行在同一个Linux进程和同一个VM中。具体方法可以将manifest中设置。
2.2 app可以请求权限使其访问设备数据,例如联系人,短信,SD卡信息,相机,蓝牙以及其他等。所有的用户权限都需要用户在安装app时授权
二、app组件
app组件是构成Android app的基础组件。Android有四大基本组件,每个不同的组件提供不同的功能,并且有着不一样的生命周期。
1. Activities 每个界面,就是一个Activity,继承子类Activity(如用户看到的界面)
2. Services 每个service是一个运行在后台的组件,能够实现长时间运行和远程操作。service不提供用户界面。继承子类Service(如后台播放音乐)
3. Content providers 能够管理app之间的数据共享。通过内容提供者,其他的app可以访问甚至修改app保存的数据。继承子类ContentProvider(如某些app可以修改系统的联系人)
4. Broadcast receivers 能够接收系统的广播事件。继承子类BroadcastReceiver (如系统发出电量过低或者锁屏的广播)
*Android有个独特的地方就是app可以调用其他app的组件,比如说你的app可以通过很简单的方法调用系统相机,并且讲拍摄的照片返回给app。
*当系统启动了一个组件,app就会被启动在系统的进程之中,并且初始化所有需要用到的类。举个例子,你的程序调用了系统相机,那么运行的进程就属于系统相机,而不是你的app进程。因此,不像其他系统中的app,Android app不会有一个单一的进入点(main函数)
三、启动组件
1. activity、service、broadcast都是通过intent来启动的。Intent可以启动你的app中的组件,也可以启动其他app中的组件。Intent可以是显式的,也可以是隐式的。
对于activity和service来说,intent定义了他们的动作(如view或者send)以及一些具体的URI。
对broadcast receiver来说,intent定义了要广播的内容。
2. ContentResolver无法通过Intent来激活,他必须通过ContentResolver来激活。
系统识别组件是否能通过intent被其他app调用,是通过在manifest文件中定义的intent filters。如果你在你的app中定义了一个intent filters,那个其他app就可以通过这个来调用你的app组件
四、Manifest.XML的作用
在系统启动app组件之前,系统必须知道app有多少组件,具体怎么知道的,就是通过Manifest.XML这个文件。你的app组件必须在这个文件中进行声明,而且必须是在
Manifest做了以下几件事:
1. 定义用户访问权限
2. 声明最小需要的API等级
3. 声明硬件和软件需要,如相机、蓝牙、触摸屏等
4. API库和需要链接的API库(如google map)