• 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

  • 相关阅读:
    ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK
    ASP.NET MVC+EasyUI+Entity FrameWork 整合开发
    ASP.NET MVC局部验证及相关问题
    asp.net mvc常用的数据注解和验证以及entity framework数据映射
    Entity Framework 一次加载许多个 Fluent API 映射
    Entity Framework Code First 常用方法集成
    ASP.NET MVC 应用程序的安全性,看一眼你就会了
    Entity Framework SqlFunctions 教你如何在EF调用sqlserver方法的函数存根
    ASP.NET MVC 及 Areas 简单控制路由
    ASP.NET MVC 表单的几种提交方式
  • 原文地址:https://www.cnblogs.com/lnhyh/p/4250808.html
Copyright © 2020-2023  润新知