当一个android应用启动一个组件(Activity、ContentProvider、BroadcastReceiver、Service),如果这个应用没有启动其他组件,那么android系统将为此应用启动一个LInux进程,并启动一个单线程去运行这个应用;如果此应用启动一个组件时此应用已经有一个线程在一个进程在运行了,那么组件将在此进程的此线程中执行。

这个线程被称为主线程(main Thread、UI Thread),此线程非常重要,此应用的所有组件的都在此线程实例化,用来分发、响应用户事件和用户交互。

因此要保证不能阻塞UI Thread(一般超过5秒,系统将会ANR)、不能在子线程中更新UI。

默认的同一个应用的所有组件(Activity、ContentProvider、BroadcastReceiver、Service)都将在此主线程中运行。

也可以让组件在不同的process中的运行。

<activity>,<service>, <receiver>, and <provider>都支持android:process属性,用来指定该组将在哪个进程中运行,也可以让不容应用的组件运行在同一个进程中。

<application>节点也支持android:process属性,配置application节点的android:process属性将应用的此应用的所有组件。

android中进程的声明周期:

android系统尝试去一直保留应用进程,但当内存低时会去杀死一些进程,通过进程的重要性去决定哪个进程保留哪个进程将被杀死,从低到高依次为:

前台进程:可获取焦点可交互的进程,通常这样的进程会被系统一直保留;

可见进程:用户可见的进程,也很重要,除非内存低要保持所有前台进程运行才会去杀死这样的进程;

服务进程:运行service的进程,此进程通过startService启动了一个service,除非内存低保持前台和可见进程运行才会杀死此进程;

后台进程:正在后台运行,activity执行了onStop方法,除非内存低需要保持前台进程、可见进程和服务进程才会杀死此进程;

空进程:没有运行任何组件的进程,保留此中进程的唯一原因就是缓存,提高下次启动组件的速度;