Android四大组件之Activity

  

  一、Activity生命周期

  上图展示Activity生命周期,简单总结一下:

  1、启动: onCreate() → onStart() → onResume()

  2、失去焦点可见:onPause(),回到activity:onResume()

  3、失去焦点不可见:onPause() → onStop(),回到activity:onRestart() → onStart() → onResume()

  4、结束:onPause() → onStop() → onDestroy()

  Activity 栈

  Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。

  每一个Activity都处于某一种状态,对于开发者来说,是无法控制其应用程序处于某一种状态的,这些均由系统来完成。但是当一个Activity状态改变时,可以通过调用onXXX()方法来处理。

  onCreate:当一个Activity启动时触发该方法,可以在此时完成初始化工作。

  onStart:Activity将要被展现给用户

  onResume:Activity和用户发生交互的时候

  onPause:前台运行的Activity因为其他的Activity需要前台运行而转入后台运行的时候,触发该方法。这时候需要将Activity的状态持久化。

  onStop:当一个Activity不在需要展示给用户的时候,触发该方法。如果内存不足,系统会直接结束这个Activity,而不会触发onStop。所以保存状态信息应在onPause完成。

  onDestroy:当Activity销毁的时候,触发该方法。和Stop一样,如果内存不足,系统会直接结束Activity而不触发该方法。

  onRestart:当处于停止状态的Activity需要再次展现给用户的时候,触发该方法。

  常见操作Activity生命周期的变化:

  1、启动activity

  

  2、Back键

  

  3、Home键 or 锁屏 or 跳转到其他Activity(原Activity不可见)

  

  4、步骤3回到原Activity

  

  5、跳转到其他Activity(原Activity可见),只调用onPause()方法,回到Activity调用onResume()

  

  6、横竖屏切换(不设置任何参数,横竖屏切换会销毁后重建),真机测试只执行一次onCreate

  

  7、设置 android:configChanges="orientation|screenSize" ,不会重新启动activity,而会调用onConfigurationChanged(Configuration)方法

       注:不设置screenSize依然会重复执行onCreate()

  

  二、Activity启动模式

  1、standard

  默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

  2、singleTop

  如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。

  3、singleTask

  如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

  4、singleInstance

在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

  singleTop一般用于当一个Activity已经开启并获得焦点后,避免再次重复开启,例如浏览器的书签,应用的通知界面。singleTask的的适用场景为一般程序的主页面。singleInstance应用于和程序分离的界面,比如闹铃,来电界面等。

  launchMode除了在AndroidManifest.xml中配置<activity android:name=".MainActivity" android:launchMode="standard" />,还可以在Activity启动时通过Intent.setFlags(int flags)来设置。而通过代码设置Activity的启动模式的方式,优先级要高于在AndroidManifest.xml清单文件中的配置。

  Intent.setFlag(int flags)方法传递的一个整形的数据,被Android系统设置为了常量:

  • FLAG_ACTIVITY_NEW_TASK:这个标识会使新启动的Activity独立创建一个Task。
  • FLAG_ACTIVITY_CLEAR_TOP:这个标识会使新启动的Activity检查是否存在于Task中,如果存在则清除其之上的Activity,使它获得焦点,并不重新实例化一个Activity,一般结合FLAG_ACTIVITY_NEW_TASK一起使用。
  • FLAG_ACTIVITY_SINGLE_TOP:等同于在LauncherMode属性设置为singleTop。

  

  三、相关的方法

  1、onWindowFocusChanged

  在Activity获得或失去焦点时被调用,例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。以上几种情况都会调用onWindowFocusChanged,并且当Activity被创建时是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause之后被调用。获取指定视图组件的尺寸大小可以在此获取。

  2、onSaveInstanceState 和 onRestoreInstanceState

  为了防止万一程序被销毁的风险,这个方法可以保证重要数据不被重置onSaveInstanceState的调用顺序是在onPause之前,onRestoreInstanceState的调用顺序是在onStart之后

参考资料:

http://blog.csdn.net/liuhe688/article/details/6733407

http://blog.csdn.net/xiaodongvtion/article/details/6799386

http://www.2cto.com/kf/201403/284469.html

http://www.cnblogs.com/fanchangfa/archive/2012/08/25/2657012.html

原文地址:https://www.cnblogs.com/lnhyh/p/4250808.html