简述Android Activity

目录:
[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() —>
  2. 异常销毁
    onPause() —> onStop() —>
  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. 解决方案链接

转载于:https://juejin.im/post/5a353a665188256970780fa6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值