生命周期

生命周期

各生命周期的作用

  • onCreate()
    • 方法内必须调用setContentView()
    • 初始化
      • 创建视图
      • 将数据绑定到列表
      • 处理Bundle 对象
      • “全局”线程
  • onStart()
    • 在 Activity 即将对用户可见之前调用
    • 调用后才被可见
  • onResume()
    • 在 Activity 即将开始与用户进行交互之前调用
    • 初始化
      • 开启动画
  • onPause()
    • 可能不会调用 onStop() 和 onDestroy(),在onPause()向存储设备写入至关重要的持久性数据
    • 尽量不处理复杂逻辑,以免影响流畅度
    • 对持久性数据的未保存更改
    • 停止动画以及其他可能消耗 CPU 的内容
  • onStop()
    • 销毁UI中的变化监听,界面变化,界面控制
    • 数据库关闭
  • onDestory()
    • 销毁“全局”线程等所有其余资源
  • onRestart()
    • 执行在onStop()之后
  • onSaveInstanceState()
    • 无法保证系统会在销毁您的 Activity 前调用 onSaveInstanceState()
    • Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改
    • 您只需为想要保存其状态的每个小部件提供一个唯一的 ID
  • onRestoreInstanceState()
    • 执行在onStart()方法之后
  • onSaveInstanceState
    • 保存一些界面数据
  • onRestoreInstanceState

三大状态

  • Resumed
    • 用户可以交互
  • Paused
    • Activity被部分隐藏,被暂停的Activity不接受输入
    • 在内存极度不足的情况下,可能会被系统终止
  • Stopped
    • 被完全隐藏、不可见
    • 在他处需要内存时可能会被系统终止

停止并重新开始Activity

  • 用户打开“最近应用”窗口并从您的应用切换到另一个应用。当前位于前台的您的应用中的Activity将停止。 如果用户从主屏幕启动器图标或“最近应用”窗口返回到您的应用,Activity会重新开始。
  • 用户在您的应用中执行开始新Activity的操作。当第二个Activity创建好后,当前Activity便停止。 如果用户之后按了返回按钮,第一个Activity会重新开始。
  • 用户在其手机上使用您的应用的同时接听来电。

流程

  • 启动
    • onCreate -> onStart -> onResume
  • 启动另一个activity2
    • onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1)
  • 再返回activity1
    • onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestroy(2)
  • BACK键
    • onPause -> onStop -> onDestory
  • HOME键
    • onPause -> onStop
  • 再启动
    • onRestart -> onStart -> onResume
  • 横竖屏切换(不处理)
    • onPause -> onStop -> onDestory -> onCreate -> onStart -> onResume
  • 横竖屏切换 处理
    • android:configChanges="keyboardHidden|orientation|screenSize"

4种启动模式

  • standard
    • 会默认创建一个新的实例
  • singleTop
    • 可以有多个实例,但是不允许多个相同Activity叠加
  • singleTask
    • 只有一个实例,直接将该Activity置于栈顶,并将该Activity以上的Activity都从任务栈中移出销毁
  • singleInstance
    • 只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在
  • 写法
    • android:launchMode="**"

任务栈

  • addFlags()
  • FLAG_ACTIVITY_NEW_TASK
    • 使用一个新的Task来启动一个Activity
  • FLAG_ACTIVITY_SINGLE_TOP
    • singleTop模式来启动一个Activity
  • FLAG_ACTIVITY_CLEAR_TOP
    • singleTask模式来启动一个Activity
  • FLAG_ACTIVITY_NO_HISTORY
    • 当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈中
  • taskAffinity属性
    • TaskAffinity 参数标识着Activity所需要的任务栈的名称,默认情况下,一个应用中所有Activity所需要的任务栈名称都为该应用的包名
    • TaskAffinity 属性一般跟singleTask模式或者跟allowTaskReparenting属性结合使用,在其他情况下没有实际意义
    • TaskAffinity属性的值不能与当前应用包名相同,否则其值跟作废没两样

注意事项

  • 如果用户在使用您的应用时接听来电或切换到另一个应用,它不会崩溃。
  • 在用户未主动使用它时不会消耗宝贵的系统资源。
  • 如果用户离开您的应用并稍后返回,不会丢失用户的进度。
  • 当屏幕在横向和纵向之间旋转时,不会崩溃或丢失用户的进度。