一、Activity是什么

setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在Android App 中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。


二、Activity的四种状态

  1. 运行中(Running/Active):这时Activity位于栈顶,是可见的,并且可以用户交互。
  2. 暂停(Paused):当Activity失去焦点,不能跟用户交互了,但依然可见,就处于暂停状态。当一个新的非全屏的Activity或者一个透明的Activity放置在栈顶,Activity就处于暂停状态;这个时候Activity的各种数据还被保持着;只有在系统内存在极低的状态下,系统才会自动的去销毁Activity。
  3. 停止(Stoped):当一个Activity被另一个Activity完全覆盖,或者点击HOME键退入了后台,这时候Activity处于停止状态。这里有些是跟暂停状态相似的:这个时候Activity的各种数据还被保持着;当系统的别的地方需要用到内容时,系统会自动的去销毁Activity。
  4. 销毁(Detroyed/killed):当我们点击返回键或者系统在内存不够用的情况下就会把Activity从栈里移除销毁,被系统回收,这时候,Activity处于销毁状态。

三、Activity 的生命周期

1.Activity 的生命周期流程图

activity是什么 android activity?_前台进程


2.Activity的生命周期分析

按场景进行分析:

1.Activity启动 : onCreate->onStart->onResume

2.点击Home键回到桌面(Activity不可见):onPause->onStop(PS:activity的状态保存,都是在onPause 中进行保存的;如果新的Activity是透明的(采用的透明主题),当前的Activity不会回调onStop)

3.当我们再次回到原Activity时: onRestart->onStart->onResume

4.当我们点击返回键退出当前activity:onPause->onStop->onDestroy(PS:重新启动原activity执行activity启动流程,而不是onRestart)

四、Activity的进程优先级

activity 的优先级分五个:

前台/可见/服务/后台/空


(一)前台进程(Foreground process) 
  前台进程是用户当前做的事所必须的进程,如果满足下面各种情况中的一种,一个进程被认为是在前台:

  1. 进程持有一个正在与用户交互的Activity。
  2. 进程持有一个Service,这个Service处于这几种状态:①Service与用户正在交互的Activity绑定。②Service是在前台运行的,即它调用了 startForeground()。③Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。
  3. 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法。

杀死前台进程需要用户交互,因为前台进程的优先级是最高的。

(二)可见进程(Visible process) 
  如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:

  1. 进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态,比如,前台的activity打开了一个对话框,这样activity就会在其后可见)。
  2. 进程持有一个Service,这个Service和一个可见的(或者前台的)Activity绑定。

可见的进程也被认为是很重要的,一般不会被销毁,除非是为了保证所有前台进程的运行而不得不杀死可见进程的时候。

(三)服务进程 (Service process) 
  如果一个进程中运行着一个service,这个service是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。

尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。

(四)后台进程 (Background process) 
  如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity(activity的onStop()被调用,但是onDestroy()没有调用的状态),就认为进程是一个后台进程。

后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。

通常会有很多个后台进程存在,它们会被保存在一个LRU (least recently used)列表中,这样就可以确保用户最近使用的activity最后被销毁,即最先销毁时间最远的activity。


(五) 空进程  


如果一个进程不包含任何活跃的应用组件,则认为是空进程。 


例如:一个进程当中已经没有数据在运行了,但是内存当中还为这个应用驻留了一个进程空间。 


保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。