美文网首页简述
简述Android Activity

简述Android Activity

作者: 萌码象C | 来源:发表于2017-06-06 15:17 被阅读0次

    目录:
    [TOC]

    1、生命周期方法

    • onCreate()
      触发时机:当Activity第一次启动的时候。
      作用:完成Activity的初始化工作(包括视图的创建,数据的绑定等等)。
      注意:该方法的参数(Bundle savedInstanceState),savedInstanceState是通过调用onSaveInstanceState()保存下的状态信息。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。

    • onRestart()
      触发时机:当处于停止状态的Activity需要再次展现给用户的时候。
      执行时机:在onCreate()之后,onStart()之前执行。
      作用:执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。

    • onStart()
      触发时机:所属活动将被展现给用户。
      作用:比较好的地方来验证某些必须的系统特性是否可用,例如广播等。 onStop()里面做了哪些清除的操作,就该在onStart()里面重新把那些清除掉的资源重新创建出来。

    • onResume()
      触发时机:当Activity和用户发生交互的时候。
      作用:初始化那些在onPause()方法里面释放掉的组件,并执行那些activity每次进入onResume()都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)。

    • onPause()
      触发时机:当一个Activity失去系统焦点后,当另一个Activity启动时或返回前一个Activity时。
      作用:停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费;
      提交在用户离开时期待保存的内容(例如邮件草稿);释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
      注意:无论什么原因导致Activity停止,系统总是会在onStop()之前调用onPause()方法。

    • onStop()
      触发时机:当一个Activity不再需要展示给用户的时候。
      作用:Activity不再可见,并且应该释放那些不再需要的所有资源,从而避免内存泄漏。
      注意:如果内存紧张,系统会直接结束这个Activity,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。在一些情况下,onPause方法或许是Activity触发的最后的方法,因此需要在这个时候保存需要保存的信息。

    • onDestory()
      触发时机:当Activity销毁的时候。
      作用:最后去清除那些可能导致内存泄漏的地方。因此需要确保那些线程都被destroyed并且所有的操作都被停止。
      注意:onDestory()和 onStop()一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。

    • onRestoreInstanceState()
      触发时机:只有在Activity销毁重建的时候。
      执行时机:会在onStart()和onResume()之间执行。
      作用:恢复异常关闭时保存的数据。

    • onSaveInstanceState()
      触发时机:当跳转Activity或应用遇到意外情况(内存不足,用户直接按home键)由系统直接销毁Activity时。
      执行时机:会在onPause()或onStop()之前执行。
      作用:系统调用该方法,允许Activity保存之前的状态,例如:EditText 组件中的文本或 ListView 的滑动位置。

    2、生命周期的三种分类

    1. 完整生命周期(Entire lifetime)
      onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()
    2. 可见生命周期(Visible lifetime)
      onStart() -> onResume() -> onPause() -> onStop()
    3. 前台生命周期(Foreground lifetime)
      onResume() -> onPause()

    3、生命周期方法启动顺序

    1. 常规启动
      onCreate()—>onStart()—>onResume()
    2. 当另一个Activity启动时
      Activity_1 onPause() —>
      Activity_2 onCreate() —> onStart() —> onResume() —>
      Activity_1 onStop()
    3. 当返回到之前Activity时
      Activity_2 onPause() —>
      Activity_1 onRestart() —> onStart() —> onResume() —>
      Activity_2 onStop() —> onDestroy()

    4、生命周期方法销毁顺序

    1. 异常销毁
      onPause() —> <Process Killed>
    2. 异常销毁
      onPause() —> onStop() —> <Process Killed>
    3. 正常销毁
      onPause() —> onStop() —> onDestroy()

    5、Activity的四种状态

    1. 活动状态(Runing)
      处于栈顶,处于可见并可和用户交互的激活状态。
      活动状态触发的函数及顺序为:
      onCreate() —> onStart() —> onResume()。
    2. 暂停状态(Paused)
      当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
      活动状态到暂停状态所触发的函数及顺序为:
      onResume() —> onPuased()。
      暂停状态恢复至活动状态所触发的函数及顺序为:
      onPuased() —> onResume()。
    3. 停止状态(Stoped)
      当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态。
      暂停状态到停止状态所触发的函数及顺序为:
      onPuased() —> onStop()。
      停止状态恢复至活动状态所触发的函数及顺序为:
      onStop() —> onRestart() —> onStart() —> onResume()。
    4. 死亡状态(Killed)
      Activity 被系统杀死回收或者没有被启动时处于 Killed 状态。
      停止状态到死亡状态分为两种情况:
      情况一:由用户操作导致,则执行onStop() —> onDestroy()。
      情况二:由系统自动强制执行,则该Activity被强行结束。

    6、Back键与Home键区别

    • Back键
      默认行为是finish处于前台的Activity,即Activity的状态为Destroy状态为止,若再次启动该Activity是从 onCreate()开始,不会调用onSaveInstanceState()。
    • Home键
      默认行为是Stop处于前台的Activity,即Activity的状态为Stop状态为止,而不是Destroy。
      若再次启动该Activity,会调用onSaveInstanceState() 方法,保持上次Activity的状态则是从OnRestart() —> onStart() —> onResume()。

    7、Activity中数据保存与恢复

    • 保存数据
      onPause(),onSaveInstance(bundle)。
    • 恢复数据
      onCreate(Bundle), onRestoreInstanceState(budle)。
      默认情况下onSaveInstanceSate()和onRestoreInstanceState()会对UI状态进行保存和恢复,如果需要保存其他数据可以在onSaveInstanceState(),onPause()保存。
      注意:如果是持久化的数据得通过onPause()保存(google推荐)。

    8、Activity的加载模式

    • 设置加载模式的两种方法

      1. Intent对象中设置的Flag;
      2. AndroidManifest.xml中进行设置,launchMode属性。
    • 四种加载模式

      1. standard
        默认模式,可以不用写配置。可以有多个相同的实例,也允许多个相同Activity叠加。
      2. singleTop
        可以有多个相同的实例,但不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
      3. singleTask
        只有一个实例。启动时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,并且允许别的Activity与其在一个task中共存。
      4. singleInstance
        只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

    9、Activity的栈管理

    链接1
    链接2

    10、典型问题及解决方案

    • 屏幕旋转Activity销毁重建
      1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
      2. 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
      3. 在Android3.2之前,设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。但在Android3.2及其之后,仍会重新调用各个生命周期一次,因为screen size也开始跟着设备的横竖切换而改变。
      4. Android3.2及其之后,设置Activity的android:configChanges=”orientation|keyboardHidden|screenSize“,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
      5. 解决方案链接

    相关文章

      网友评论

        本文标题:简述Android Activity

        本文链接:https://www.haomeiwen.com/subject/dvogfxtx.html