番外: 如何分析问题:
1. 一个问题的出现,必然有它的原因,场景,触发条件
2. 冷静的分析解决问题:
1. what 这个问题是什么
2. when 在什么场景下发生的
3. how 上下文是什么,如何被触发
4. why 为什么被触发
一:Activity
1. 什么是Activity
1. Android 四大组件之一
2. 是 context 子类,同时实现了 window.callback、keyevent.callback 可以处理窗体与用户交互的事件
3. 常见的 Activity 有 FragmentActivity、ListActivity、TabActivity
4. 如果界面有共同的特点或工鞥呢,我们还会自己定义一个 BaseActivity
2. Activity 的生命周期
1. onCerate 初始化
2. onStart 可见 不可交互
3. onResume 获得焦点,可交互,此时的 Activity 进入运行状态
4. onPause 失去焦点
5. onStop 不可见
6. onRestart 重新变得可见
3. 启动一个 Activity
1. 先调用 onCreate 初始化
2. 再调用 onStart 可见
3. 最后调用 onResume 获得焦点
4. 失去焦点
1. 会调用 onRause 暂停当前 Activity 的执行
5. Activity 不可见
1. 先调用 onPause 失去焦点
2. 再调用 onStop 变得不可见
6. 再次可见
1. 先调用 onRestart
2. 再调用 onStart 变得可见
3. 最后调用 onResume 进入运行状态
7. 系统杀死当前 Activity<内存不足>,再退回当前 Activity
1. 重新走流程 onCreate -> onStart -> onResume
2. 说明:
1. 当系统认为一个 Activity 可能会被回收时,系统会调用它的 onSaveInstanceState 方法
2. 当一个被回收的系统被重新打开时,系统会调用它的 onRestoreInstanceState 方法
3. 当 Activity 系统配置发生改变后,如果他被重新启动,那么系统会:
1. 通过 onSaveInstanceState 保存数据
2. 同时通过 onRestoreInstance 来恢复数据
8. 横竖屏切换时 Activity 的生命周期
1. 跟清单文件中的配置有关:
1. 不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,默认首先贤惠当前的 Activity 然后重新加载
2. 设置时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法
9. 将一个 Activity 设置成窗口样式
1. 配置:android:theme=“@androids:style/Theme.Dialog”
10. 如何退出一个 Activity
1. 返回键退出
2. 代码直接调用 finish() 方法
11. 如何安全退出已调用多个 Activity 的 App
1. 记录打开的 Activity,退出时关闭每一个即可
2. 发送特定的广播关闭 Activity
3. 递归退出:在打开新的 Activity 时,调用 startActivityResult 方法,然后自己加 tag,在 onActivityResult 中处理
12. Activity 的 4 种 LaunchMode<启动模式>
1. standard 标准模式 <默认>:
1. 不管有没有已存在的实例,都会生成一个新的实例
2. 可以有多个相同的实例,允许多个相同的 Activity 叠加
2. singleTop 栈顶复用:
1. 对应的 Activity 实例位于栈顶,则重复利用,否则生成新的实例
2. 调用 onNewIntent 方法 <没有创建新的 Activity>
3. 避免栈顶的 Activity 被重复创建,影响用户体验
4. 应用场景:浏览器书签
3. singleTask 栈内复用
1. 该 Activity 实例之上的其他 Activity 实例全部出栈
2. 使此 Activity 实例成为栈顶对象,显示到屏幕前
4. singleInstance 单例
1. 启用一个新的栈结构,将该 Activity 的实例放置中,并保证不会有其他的 Activity 实例进入
13. Activity Window View 三者之间的关系
1. Activity 控制单元,Window 承载模型,View 显示视图
2. Activity 在创建时,还会创建一个 window、DecorView
2. Activity 通过 ViewRoot 将视图 View 添加在 Window 上
3. Activity 控制、依赖 Window,Window 通过 ViewRoot 和 DecorView 和 View 建立联系
14. 如何判断当前的应用是在前台还是后台?
1. 在 Activity 的生命周期中维护一个常量值
2. 在 onStart 时 appCount +1
3. 在 onStop 时 appCount -1
4. 判断该值是否为 0,就可以判断该 App 是在前台还是后台
5. eg:
1. 启动 Activity A,onStart appCount = 1,
2. 在 A 中启动 Activity B,APPCount = 2,
3. A 经过 onStop,APPCount = 1
4. 直接退出,按 Home,没有 onStart,只经历 onStop,此时处于后台,appCount = 0