Android Activity启动模式

Android Activity启动模式

Android软件体系架构

Android软件体系结构

静态视图

Tasks

  • Task (属于操作系统,不属于application)

    查看Tasks

  • Menu键
  • adb shell dumpsys activity activities | sed -En -e ‘/Stack #/p’ -e ‘/Running activities/,/Run #0/p’

Task的启动方式

  1. 新建
    • 通知
      • 系统
      • 自己
    • scheme
    • 第三方应用
  2. 恢复(activity 由不可见到获得焦点)
    • navigation启动
    • back按键
    • 标题栏back按钮
  3. launcher启动
    • Task不存在
    • Task已存在

      Activity&Fragment的生命周期

      fragment

      静态加载
      动态加载

Activity生命周期

activity
activity

相邻状态之间的区别

ActivityA->ActivityB

onPauseA -> onCreateB -> onStartB -> onResumeB -> onStopA

ActivityB->ActivityA

onPauseB -> onRestartA -> onStartA -> onResumeA -> onStopB

  1. onCreate 和 onStart
    1. 可见与不可见。
    2. 执行的次数。onCreate只在Activity创建的时候执行一次;onStart在Activity切换和Home键返回桌面在切换回来的过程中被多次调用,所以Bundle的数据回复在onStart中进行比在onStart中更合适。
    3. onCreate中能做的onStart都可以做,但在onStart中的事onCreate未必能做。eg:动画的初始化在onStart中比较好。
  2. onStart 和 onResume
    1. 是否在前台
    2. 职责不同,onStart负责初始化的工作,onResume负责动画的开启和设备独占的操作。
  3. onPause 和 onStop
    1. 是否可见
    2. 系统内存不足的时候可能不会执行onStop,so 程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但是不能进行耗时操作。
  4. onStop 和 onDestroy
    • nStop时对象还在内存中,此时可以切换回该Activity
    • onDestroy时Activity已经被销毁。

onNewIntent生命周期

onNewIntent

  1. 只对singleTop,singleTask,singleInstance有效,因为每次都是新建。
  2. 只对startActivity有效。

Standard等4种启动模式

standard

系统在启动Activity的Task中创建Activity的新实例并向其传送Intent。

  1. 从非Activity的context启动时,需要带上NEW_TASK的flag;
  2. 当启动一个带有affinity的Activity时,如果已经有实例在该Task中,则不会重新创建;
  3. 如果从应用内启动的standard activity的affinity就是App默认的affinity(即应用包名),则每次新建一个实例;

    singleTop

    栈顶有相同实例时,Intent不会重新创建Activity而是通过onNewIntent被发送到现有的Activity

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    存在需要启动的Activity的Affinity的Task?  -Y->  在栈顶?  -Y-> 直接调用栈顶Activity的onNewIntent
    | |
    | N
    | |-> 在栈顶创建Activity
    N
    |-> 在栈顶? -Y-> 直接调用栈顶Activity的onNewIntent
    |
    N
    |-> 带有NEW_TASK的标记? -Y-> 创建启动Activity的affinity的Task,创建Activity
    |
    N
    |-> 在当前的Task栈顶创建Activity

singleTask

和SingleTop类似,栈中是否有实例? affinity是否存在?affinity中是否有实例?
栈中有实例启动的时候pop上面的实例,直至移动到栈顶

singleInstance

和singleTask相同,系统不会将其他Activity启动到它的Task中,此种Activity有且仅有一个存在于一个栈中

Intent Activity Flag

  • Task创建
    • NEW_TASK
    • MULTIPLE_TASK
    • NEW_DOCUMENT
  • 确定了Task后对它的操作
    • CLEAR_TASK
    • CLEAT_TOP
    • SINGLE_TOP
    • REORDER_TO_FRONT
  • 启动的标志设置
    • NO_USER_ACTION
    • LAUNCHED_FROM_HISTORY
  • 启动的过程设置
    • NO_ANIMATION
  • 返回的地方
    • TASK_ON_HOME
    • FROWARD_RESULT
  • 返回后的状态
    • EXCLUDE_FROM_RECENTS
    • RETAIN_IN_RECENTS
    • NO_HISTORY

启动模式应用场景

  • singleTop

    适合启动同类型的Activity,eg:接收通知启动的内容显示页面、耗时操作返回页面、登录页面

  • singleTask

    适合作为程序入口,eg:WebView页面、扫一扫页面、确认订单界面、付款界面

  • singleInstance

    适合需要与程序分开的分离开的页面,eg:闹铃的响铃界面、来电页面、锁屏页

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×