不同于其他平台的APP,安卓的APP只能有限得控制自个儿的生命周期。 取而代之的事,安卓的APP组件必须监听生命周期的改变,然后做出必要的回应,以免在一些特殊情况因为资源的紧张被系统杀死。
默认的,每个安卓程序都运行在一个独立的进程中,并且进程都运行在独立的Dalvik虚拟机实例中。在运行时,内存和进程的管理被独立的处理。
TIP:你可以强制你的APP中的不同组件运行在不同的进程中,也可以让不同APP的组件运行在同个进程中,只要在mainfest中,通过设置组件结点android:process属性来指定进程。
安卓粗暴得管理它的资源,为了确保一个流畅和稳定的用户体验,它在关键时候绝不留情得杀杀杀。也就是说,在没任何警告下,你的APP进程可能就被杀死,为了给更高优先级的APP提供空间和资源。
理解APP的优先级和进程状态
安卓杀死它所托管的APP进程是根据优先级来选择的。一个APP的优先级与它组件的最高优先级相同。
如果两个APP的优先级相同,那么运行最久的那个会被优先杀死。进程的优先级也被进程间的依赖性所影响;如果一个APP依赖于第二个APP提供的Service或者Content Provider,
那么第2个APP的优先级至少不会低于依赖于它的APP。
重要:构建你的APP去确保它的优先级是合适当前所正在做的工作,否则。。。。不解释了
接下来详细解释上面那张图:优先级从高到低,越低越容易被杀死
1.Active processes 活跃的进程--前台进程 拥有用户正在交互的组件。 这些进程是安卓力保的,也就是说它为了这些进程,不惜杀死在后台的某个优先级低的进程从而获取足够当前进程运行的空间和资源。
那么哪些被定义为活跃的进程呢?
1.正在跑的Activities (正在前台与用户交互)
2.BroadcastReceiver 正在执行onReceive方法。
3.Services 正在执行onStart,onCreate,onDestory方法
4.正在运行的Services被标记为运行在前台// 以后讨论,所谓运行在前台的服务
2.Visible Process 可见进程----可见但是未被激活的进程,比如activity onPause(部分可见)状态下。可见进程虽然可见,但是它并不属于前台否则它会对用户的事件作出反应。在资源紧张的时候安卓也会为保住active process而杀掉Visible Process 。
3.Started Service processes 已经在在运行的服务。 因为服务没有与用户直接交互,所以它还是比Active processes和Visible Process 优先级略低。 当考虑到前台进程资源紧张时候,安卓也有可能杀死它,当资源充裕的时候,服务又会重新开启。关于Service这里先不做过多讨论。
4.Background processes 后台进程 activties 不可见了而且也没有携带任何正在运行的服务。 在后台待得越久的Activities越优先被杀死。
5.Empty processes 一个进程中没有任何组件。如果要保存这进程,只有一种原因:为了缓存的考虑,APP下一次启动速度加快。系统经常为了平衡底层的linux缓存和这些APP的缓存,从而杀死这些进程。