Android软件体系架构
Android软件体系结构
Tasks
- Task (属于操作系统,不属于application)
查看Tasks
- Menu键
adb shell dumpsys activity activities | sed -En -e ‘/Stack #/p’ -e ‘/Running activities/,/Run #0/p’
Task的启动方式
- 新建
- 通知
- 系统
- 自己
- scheme
- 第三方应用
- 通知
- 恢复(activity 由不可见到获得焦点)
- navigation启动
- back按键
- 标题栏back按钮
- launcher启动
Activity生命周期
相邻状态之间的区别
ActivityA->ActivityB
onPauseA -> onCreateB -> onStartB -> onResumeB -> onStopA
ActivityB->ActivityA
onPauseB -> onRestartA -> onStartA -> onResumeA -> onStopB
- onCreate 和 onStart
- 可见与不可见。
- 执行的次数。onCreate只在Activity创建的时候执行一次;onStart在Activity切换和Home键返回桌面在切换回来的过程中被多次调用,所以Bundle的数据回复在onStart中进行比在onStart中更合适。
- onCreate中能做的onStart都可以做,但在onStart中的事onCreate未必能做。eg:动画的初始化在onStart中比较好。
- onStart 和 onResume
- 是否在前台
- 职责不同,onStart负责初始化的工作,onResume负责动画的开启和设备独占的操作。
- onPause 和 onStop
- 是否可见
- 系统内存不足的时候可能不会执行onStop,so 程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但是不能进行耗时操作。
- onStop 和 onDestroy
- nStop时对象还在内存中,此时可以切换回该Activity
- onDestroy时Activity已经被销毁。
onNewIntent生命周期
- 只对singleTop,singleTask,singleInstance有效,因为每次都是新建。
- 只对startActivity有效。
Standard等4种启动模式
standard
系统在启动Activity的Task中创建Activity的新实例并向其传送Intent。
- 从非Activity的context启动时,需要带上NEW_TASK的flag;
- 当启动一个带有affinity的Activity时,如果已经有实例在该Task中,则不会重新创建;
- 如果从应用内启动的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:闹铃的响铃界面、来电页面、锁屏页