Activity 是啥

  • Activity是用于负责提供用户交互的可视化界面,一个应用程序可以有一个或者多个Activity,一般情况下,每个窗口都是满屏的,但是它也可以是一个小的,位于其他窗口之上的浮动窗口。
  • Android允许同时运行多个应用程序,应用程序可以拥有前台进程和后台进程,然而在同一时刻只能由一个应用程序的Activity处于前台。

Activity 生命周期

完整生命周期:

从第一次调用onCreate开始到onDestroy为止,Activity在onCreate中设置所有全局状态以完成初始化,而在onDestroy中释放所有的系统资源:

  • onCreate:当一个Activity首次运行的时候被回调,负责初始化任务,onCreate方法仅具有一个传入参数,即一个Bundle对象,但对于首次启动的Activity而言,这个参数为空,如果这个Activity先前因为内存的原因而被终止,现在又需要重新启动,那么Bundle对象中将包含Activity先前的状态信息,这样它才能被重新初始化。
    主要任务:填充用户UI,将数据绑定到控件,得到Fragment引用,启动Service和定时器

  • onRestoreInstanceState :在onCreate方法完成后调用该函数用于恢复UI状态。
    onRestoreInstanceState 只有在当前视图被系统销毁了时候被调用,因此有时候onSaveInstanceState方法和onRestoreInstanceState方法不一定是成对出现的

  • onDestroy:销毁Activity的时候被调用。
    主要任务:确保清除了onCreate创建的所有资源,并保证所有的外部连接如网络或数据库已经被关闭。

可视生命周期:

从onStart到onStop。在此期间,用户是可见的但是可能还未获得焦点,尚且不能与用户交互。 在这两个方法之间,可以保留用来向用户显示这个Activity所需要的资源,例如,当用户看不到显示的内容的时候,可以在onStart中注册一个BroadCastReceiver广播接收器来监控可能影响的UI变化,而在onStop中来注销,onStart和onStop方法可以随着应用是否被用户可用而被多次调用。

  • onStart:当一个Activity即将显示时被回调,可见生命周期的开始。在这个阶段可以完成如注册专门用于更新用户界面的BroadCast Receiver等工作。
  • onStop:停止Activity的时候被调用。当前Activit处于不可视状态。
    主要任务:暂停或者停止动画,线程,传感器监听器,GPS查找,定时器,启动Service和定时器,或者其他用于更新用户界面的进程,当UI不可见的时候更新它是没有意义的,不但耗费了资源,却没起到实际的作用。当UI再次可用的时候,可使用onStart或者OnRestart方法来恢复或者重启这些线程。
前台生命周期:

从OnResume调用起,至相应的onPause调用为止,在此期间,Activity位于前台最上面并与用户开始进行交互.

  • onResume:这时候该Activity可以接受用户的输入事件,与用户进行交互,同时当Activity由于暂停恢复为活动状态的时候这个方法被调用。调用该方法后,该Activity位于Activity栈顶。在这个方法中不需要重新加载UI状态,因为当要求加载UI状态的时候,它会由onCreate和onRestoreInstanceState方法处理。

  • onPause:暂停的时候被回调,在该方法中通常用于存储持久的数据,在该方法中应该终止在OnrResume方法中播放的所有音频,视频和动画,同时在该方法中还必须解除某些资源,例如:在手动管理而非自动管理情况下的数据库Cursor对象。onPause方法是Activity在后台最后一次能够有机会进行清理工作,释放无需资源的地方,如果没有及时释放,这些资源将有可能不能被彻底释放掉。同时需要保存所有未提交的数据,以免由于程序终止后不再返回而丢失数据。
    应该尽量保证在onResume ,onPause方法中代码较少,以保证前台和后台之间进行切换的时候应用程序能够保持响应。在onPause方法中释放越多的资源,转入后台的Activity被终止的可能性就越小。

  • onSaveInstanceState:这个方法提供了把Activity的UI状态保存在Bundle中的机会,这个Bundle会被传递给onCreate和onRestoreInstanceState方法。一般在这个方法中保存,复选状态,用户焦点,已经输入但未被提交的用户输入,从而保证当Activity下次变成活动的时候,可以呈现出与之前相同的UI。
    这里需要注意的它是只有在非你本来意愿销毁了你的activity的时候被系统调用。但是在activity是被用户主动销毁的情况下(例如我们人为按下back键)不会被调用,下面是一些常见的情况:

  1. 当用户按下HOME键时
  2. 按下电源键灭屏的时候
  3. 从一个Activity A中启动一个新的Activity时。
  4. 在指定configchange属性的情况下切换屏幕方向
    布局中的每一个View默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动的存储并在activity重新创建的时候自动的恢复。但是这种情况只有在你为这个UI提供了唯一的ID之后才起作用,如果没有提供ID,将不会存储它的状态。
    onSaveInstanceState()如果被调用,这个方法会在onStop()前被触发,但系统并不保证是否在onPause()之前或者之后触发
典型的Activity生命周期:
启动Activity: onCreate()—>onStart()—>onResume(),Activity进入运行状态。
Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()
Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()—>onStop(),进入停滞状态。
Activity返回前台: onRestart()—>onStart()—>onResume(),再次回到运行状态。
锁定屏与解锁屏幕 只会调用onPause(),而不会调用onStop()方法,开屏后则调用onResume()

Activity任务堆栈

直接上图不解释:

我们可以通过android:launchMode = “standard|singleInstance|singleTask|singleTop”来控制Acivity任务栈。

standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。
singleTop : 这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时Activity的onNewIntent()方法会被回调.如果Activity已经存在但是不在栈顶,那么作用于standard模式一样.
singleTask: 创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,并调用onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.
singleInstance : 这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了

如果对上面的不大理解可以参考如下的文章,说的很详细,为了避免作者把文章取消所以把重点的引用如下:
http://www.cnblogs.com/xiaoQLu/archive/2011/09/29/2195742.html

standardActivity的默认加载方法,即使某个ActivityTask栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D  D C B A将会依次弹出栈而显示在界面上。
singleTop:如果某个ActivityLaunch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C DDLaunch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTopD跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B
singleTask:如果某个ActivitysingleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C DBLaunch modesingleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而CD被弹出销毁了,也就是说位于B之上的实例都被销毁了。
singleInstance:将Activity压入一个新建的任务栈中。例如:Task1的情况为:A B CC通过Intent跳转到D,而DLaunch modesingleInstance,则将会新建一个Task2。此时Task1的情况还是为:A B CTask2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为CLaunch modestandard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D

Activity 状态

上面介绍了Activity的堆栈接下来就来介绍下,Activity的状态,Activity状态是由其在Activity堆栈的位置决定的:

Android应用程序生命周期

Android应用不能控制它们自己的生命周期,它是由Android运行时控制的,默认情况下每个应用程序都是通过它们自己的进程运行的,每个进程都运行在独立的Dalvik实例中,每个应用程序的内存和进程管理都是由运行时专门进行处理的。
回收资源的时候,进程被终止的顺序是由它们的应用优先级所决定的,一个应用程序的优先级等同于它的优先级最高的组件的优先级。
当两个应用程序优先级相同的时候,在较低优先级状态运行时间最长的进程将会首先被终止。
进程的优先级也受进程间依赖性的影响,如果一个应用程序依赖于第二个应用程序所提供的Service或者Content Provider,那么第二个应用程序至少拥有与它所支持的这个应用程序相同的优先级。

进程状态

  1. 活动进程:指的是有组件正在和用户进行交互的应用程序进程,Android尝试回收其他应用状态资源来支持这些进程运行。

活动的进程包括:

  • 处于活动状态的Activity。
  • 正在运行,且已被标记为前台运行的Service
  • 正在执行onCreate ,onStart,onDestroy事件处理的Service。
  • 正在执行onReceiver 事件处理程序的BroadCast Receiver
  1. 可见进程:可见但是非活动的进程是指那些包含“可见”Acitivity的进程。

  2. 启动服务进程:已经启动的Service的进程,因为后台Service没有直接和用户交互,所以它的优先级要比可见进程或者前台Service低。

  3. 后台进程:不可见并且没有任何正在运行的Service的Activity进程,通常会有大量的后台进程。

  4. 空进程:为了提高系统整体性能,Android经常在应用程序的生存周期结束后仍然把它们保存在内存中,Android通过维护这个缓存来减少应用程序被再次启动时的启动时间。

Activity的创建

  1. 创建一个类继承自Activity,并重写相应的方法。
  2. 编写布局文件,设置布局。
  3. 在Android Manifest中配置Activity。

Activity属性

Contents
  1. 1. Activity 是啥
  2. 2. Activity 生命周期
    1. 2.0.1. 完整生命周期:
    2. 2.0.2. 可视生命周期:
    3. 2.0.3. 前台生命周期:
    4. 2.0.4. 典型的Activity生命周期:
  • 3. Activity任务堆栈
  • 4. Activity 状态
  • 5. Android应用程序生命周期
  • 6. 进程状态
  • 7. Activity的创建
  • 8. Activity属性