天天看点

Android中组件与进程的剥离

注意事项:

1.

通过广播可以进行组件之间的通信。

2.

将组件和进程进行剥离,那么在组件关闭后,该组件所依赖的进程可以继续存在,当用户再次使用或者调出该组件的时候,因为其所依赖的进程仍然存在于内存中,所以该组件就会很快的呈现给用户,不用再重新建立其所依赖的进程了。

3.

当进程关闭后,依赖于该关闭进程的组件可以继续存在,当该用户需要调用该组件的时候,会检测该组件所依赖的进程已经不存在了,就会马上创建该进程,而该组件很显然不用再次重新建立了,所以会很快的呈现给用户,基本上是无缝的,总结一句话就是:进程对组件是透明的。

4.

组件所涉及的问题包括:组件的开启和关闭、组件的状态、组件运行时所需要的进程,组件通信。

5.

在AndroidManifest.xml中下的activity标签下,可以使用android:process属性进行设置,让activity跑在不同的进程里面。

6.

adb是与Android仿真器沟通最重要的桥梁。如果要跟Android底层的Linux操作系统进行沟通,就必须通过 Android SDK tools目录下的adb(android debug bridge) 指令来进行操作。

7.

由于将组件和进程进行了剥离,在进程被回收不会影响其上的组件的声明周期。

下面介绍一下:Activity Manager Service、Binder IPC、Low Memory Killer

1.Activity Manager Service。

关闭组件,但其所在的进程未关闭,用户在调用该组件的使用,因为其所依赖的进程依然存在,会提高速度。AMS在适当的时候会去检查有哪些进程现在已经没有组件在里面存在或者是后台的进程,然后将这些进程进行杀死并回收内存。

2.Binder IPC。

用于进行组件之间的通信,包括两层含义:进程之间的通信、进程内的通信。进程内的通信相当于直接调用函数;进程之间的通信,如果使用Socket/管道/消息队列,数据拷贝次数为2次,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。如果使用Binder IPC仅需要拷贝数据一次,Android需要建立一套新的IPC机制来满足系统对通信方式,传输性能和安全性的要求,这就是 Binder,Binder基于Client-Server通信模式,传输过程只需一次拷贝。

3.Low Memory Killer。

当系统内存不足时,需要进行内存回收时,被回收的优先顺序是:Empty Process、Hidden Process、Perceptible Process(用户可以感知的,如后台的音乐播放进程)、Visible Process、Foreground Process。andorid的内核是linux,线程销毁都是由系统决定的。

android的process有5个等级:

1、Foreground Process (前台进程)

foreground 的优先级最高,他处于前台

a 正处于Activity Resume()状态

b 正处于与bound服务交互的状态

c 正处于服务在前台的状态,(startForeground()被调用)

d Service生命周期函数正在被执行(onCreate(),onStart(),onDestroy())

e BroadcastReceiver正在执行onReceive()方法

杀死Foreground Process需要用户响应,因为这个安全优先级是最高的。

2、Visible Process

Activity不在前台显示,但也没有隐藏,能够看的见,比如弹出一个对话框 (input Method)

一个bound到visible或者foreground的activity的Service ,或者是一个输入法

3、Service Process

正在运行的,不在上述两种状态的Service

4、Background Process

不可见状态的Activity进程,onStop()被调用

5、Empty Process

没有运行任何Components的进程,保留这个进程主要是为了缓存的需要。

                       注:部分内容参考自http://blog.csdn.net/llbupt/article/details/7358360