一、信息
整理:yoyiyi(soleil雪寂)
创建时间:2019 年 6 月 25 日
修改时间:2020 年 1 月 11 日
校对:yoyiyi(soleil雪寂)
状态:更新中
字数:2875 字
仓库:Soleil-Notes
二、目录
- 1、Activity 生命周期
- 2、Activity 状态
- 3、Activity 四种启动模式以及使用场景
- 4、Activity、View、Window 之间的关系
- 5、Activity 之间的通讯方式
- 6、描述一下 Activity 栈
- 7、横竖屏切换时候 Activity 的生命周期
- 8、Activity 与 Fragment 之间的生命周期
- 9、Activity上有 Dialog 时候按 Home 键时生命周期
- 10、当 Activity 设置为透明主题时,按 Home 键,Dialog 闪烁如何解决
- 11、两个 Activity 跳转必然会执行那几个方法
- 12、如何启动其他应用的 Activity
- 13、Activity 状态保存和恢复
- 14、Activity 和 Service 如何绑定
- 15、下拉状态栏是不是影响 Activity 的生命周期
- 16、Activity 常用的标记位 Flags
- 17、如何将一个 Activity 设置成窗口的样式
- 18、Activity 的 startActivity 和 Context 的 startActivity 区别
- 19、Android 怎么加速启动 Activity
- 20、Activty 和 Fragment 之间怎么通信,Fragment 和 Fragment 怎么通信
- 21、ActivityA 跳转 ActivityB 然后 B 按 back 返回 A,各自的生命周期顺序,A 与 B 均不透明
- 22、更新 UI 方式
- 23、直接在 Activity 中创建一个 Thread 跟在 Service 中创建一个 Thread 之间的区别
- 24、Activity 异常情况下的生命周期
三、正文
1、Activity 生命周期
Activity 生命周期一共七个方法:
- onCreate():Activity 正在被创建,可以做些初始化工作,比如 setContentView 加载界面布局文件、初始化 Activity 所需数据等。
- onStart(): 表示 Activity 正在被启动,Activity 可见,处于前台,但是无法和用户交互。
- onRestart():表示 Activity 正在重新启动,当 Activity 不可见变为可见状。
- onResume(): 表示 Activity 可见,出现在前台,可以和用户交互。
- onPause(): 表示 Activity 正在停止,正常情况下,会调用 onStop() 。
- onStop():表示 Activity 即将停止。
- onDestroy():表示 Activity 即将被销毁,常常做回收工作、资源释放。
注:参考《Android开发艺术探索》
2、Activity 状态
- 激活状态:Activity 位于屏幕前端,可以与用户交互,也称为运行状态。
- 暂停状态:Activity 被遮挡,但是依旧可见。
- 停止状态:Activity 完全被遮挡,不可见。
- 销毁状态:Activity 被销毁了。
3、Activity 四种启动模式以及使用场景
- standard 标准模式:每次启动创建一个 新 Activity。
- singleTop 栈顶复用模式:判断 Activity 是不是栈顶,是则调用 onNewIntent(),否则创建新 Activity。常常用于通知启动界面(新闻类 App 通知,点击跳转到内容界面)。
- singTask 栈内复用模式:只要 Activity 在栈中存在,多次启动,不会创建新实例,会调用onNewIntent(),并且还有 clearTop 功能,把上面的 Activity 清理掉。常常用于程序入口(浏览器主界面)。
- singInstance 单实例模式:创建一个单独任务栈,只有一个 Activity 实例,例如闹铃、呼叫来电界面。
4、Activity、View、Window 之间的关系
- Activity 创建时候调用 attach(),创建一个 Window(子类 PhoneWindow);
- Activity 调用 setContentView(R.layout.xxx)实际上调用 getWindow().setContentView()(PhoneWindow中的setContentView()),将 view 设置到 PhoneWindow 中,PhoneView 持有一个 DecorView,DecorView 是一个FrameLayout,有 ActionBar + ContentParent(LayoutInfalte 解析 xml 赋值给 mContentParent(本质 ViewGroup))组成,ContentParent就是我们布局文件。
- PhoneWindow 内部通过 WindowManager 的 addView()、removeView()、updateViewLayout()这三个方法来管理 View 的。
- 总结
Activity 中包含一个 PhoneWindow(继承 Window),Activity 通过 setContentView 将 View 设置到了 PhoneWindow 上,PhoneWindow 通过 WM 来管理 View。
TODO:详解
5、Activity 之间的通讯方式
- Intent
- 类静态变量
- Application 中设置全局变量
- SharedPreference、SQLite、文件
- 接口回调
- EventBus、RxBus等
6、描述一下 Activity 栈
简单来说就是用来存放 Activity,遵循先先进后出原则。
TODO:待完善
7、横竖屏切换时候 Activity 的生命周期
与 android:configChanges 设置有关
- 不设置 android:configChanges :销毁当前 Activity ,重新调用生命周期,切横屏一次,切竖屏两次。
- 设置 android:configChanges=“orientation”
- 在Android5.1 即 API 23级以下:切屏会重新调用生命周期,切横、竖屏都一次。
- 在Android9 即 API 28级以下:不会调用各个生命周期,只会执行 onConfigurationChanged()。
- 设置 android:configChanges=“orientation|keyboardHidden|screenSize”:不会重新调用生命周期,调用 onConfigurationChanged()。
- 解决
- 强制横屏:android:screenOrientation=“landscape”
- 强制竖屏:android:screenOrientation=“portrait”
8、Activity 与 Fragment 之间的生命周期
9、Activity 上有 Dialog 时候按 Home 键时生命周期
有 Dialog 和没有 Dialog 按 HOME 键效果一样
- 正常启动:onCreate、onStart、onResume
- 按HOME键:onPause、onStop
- 再次启动: onRestart、onStart、onResume
10、当 Activity 设置为透明主题时,按 Home 键,Dialog 闪烁如何解决
- 原因
因为 Activity 设置成透明主题,没有正常的退出动画,而 Dialog 主要退出动画,造成闪烁。- 解决
提升 Dialog 的窗口层级,设置为系统级别的悬浮窗。mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
11、两个 Activity 跳转必然会执行那几个方法
ActivityA、B
- A:onPause
- B:onCreate、onStart、onResume (假如 B 已存在栈中,B 不调 onCreate 调用,调 onRestart)
- A:onStop(假如 B 为透明窗口或对话框,A 不调 onStop)
12、如何启动其他应用的 Activity
- 通过隐式 intent 调用方法实现
//1.被调用activity添加 <intent-filter> <action android:name="com.example.project.SHOW_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> //2.启动 Intent intent = new Intent(); intent.setAction("com.example.project.SHOW_ACTIVITY"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);推荐使用
- 使用 ComponentName
Intent intent = new Intent(); intent.setComponent(new ComponentName("要调用应用包名","要调用Activity全路径")); startActivity(intent);
13、Activity 状态保存和恢复
onSaveInstanceState
- 当 Activity 被异常杀死(系统配置发生改变、系统内存不足等),调用 onSaveInstanceState 保存状态。
- 调用在 onStop 之前,与 onPause 顺序不定。
onRestoreInstanceState
发生1.情况时候,重新创建 Activity 调用 onRestoreInstanceState 来恢复数据onCreate()里也有 Bundle 参数,可以用来恢复数据,它和 onRestoreInstanceState 有什么区别
- 因为 onSaveInstanceState 不一定会被调用,所以 onCreate()里的 Bundle 参数可能为空,如果使用 onCreate()来恢复数据,一定要做非空判断。
- onRestoreInstanceState 的 Bundle 参数一定不会是空值。
参考阅读:
onSaveInstanceState()和onRestoreInstanceState()使用详解
14、Activity 和 Service 如何绑定
使用 bindService()来与一个服务进行绑定,一个绑定的服务提供了一个客户端-服务器端接口来允许组件与服务进行交互,发送请求,得到结果甚至通过IPC进程间通信来完成操作。只有当其它组件与服务进行绑定时,服务才会处于绑定状态。多个组件可以同时与服务绑定,但是当他们全部都解除绑定时,服务就会销毁。
15、下拉状态栏是不是影响 Activity 的生命周期
通过实践发现 Android 下拉通知栏不会影响 Activity 的生命周期方法
16、Activity 常用的标记位 Flags
- FLAG_ACTIVITY_NEW_TASK :对应 singleTask 启动模式,其效果和在 XM L中指定该启动模式相同;
- FLAG_ACTIVITY_SINGLE_TOP : 对应 singleTop 启动模式,其效果和在 XML 中指定该启动模式相同;
- FLAG_ACTIVITY_CLEAR_TOP : 具有此标记位的 Activity,当它启动时,在同一个任务栈中所有位于它上面的 Activity 都要出栈。这个标记位一般会和 singleTask 模式一起出现,在这种情况下,被启动 Activity的实例如果已经存在,那么系统就会回调 onNewIntent。如果被启动的 Activity 采用 standard 模式启动,那么它以及连同它之上的 Activity 都要出栈,系统会创建新的 Activity 实例并放入栈中;
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有这个标记的 Activity 不会出现在历史 Activity 列表中;
17、如何将一个 Activity 设置成窗口的样式
//1.设置窗口样式 android:theme="@android:style/Theme.Dialog" //2.设置透明 android:theme="@android:style/Theme.Translucent"
18、Activity 的 startActivity 和 Context 的 startActivity 区别
- 从 Activity 中启动新的 Activity 时可以直接 mContext.startActivity(intent)就好。
- context 中 startActivity,intent 必须设置 Flag,否则会出错。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ; mContext.startActivity(intent);
19、Android 怎么加速启动 Activity
- onCreate 不要启动耗时操作
- 将 View 细分,使用 AsyncTask 或者 Handler 逐步加载
- 分页加载界面
- 优化布局文件
- 提高 Adapter 和 AdapterView 的效率
- 利用多线程技术,先让用户看到界面,再异步填充数据
20、Activty 和 Fragment 之间怎么通信,Fragment 和 Fragment 怎么通信
- Handler
- 广播
- 接口回调
- 事件总线
- Bundle 和 setArguments(bundle)
- 全局变量/Application
21、ActivityA 跳转 ActivityB 然后 B 按 back 返回 A,各自的生命周期顺序,A 与 B均不透明
1. A -> B A:onPause B:onCreate B:onStart B:onResume A:onStop 2. B -> A B:onPause A:onRestart A:onStart A:onResume B:onStop B:onDestroy
22、更新 UI 方式
- Activity.runOnUiThread(Runnable)
- Handler
- AsyncTask
- Rxjava
- View.post(Runnable),View.postDelay(Runnable, long)
- LiveData
23、直接在 Activity 中创建一个 Thread 跟在 Service 中创建一个 Thread 之间的区别
- 在 Activity 创建
该 Thread 的就是为这个 Activity 服务的,完成这个特定的 Activity 交代的任务,主动通知该 Activity 一些消息和事件,Activity 销毁后,该 Thread 也没有存活的意义了,如果使用不当,Activity 销毁, Thread 还在运行,可能造成内存泄露。- 在 Service 创建
用户执行后台任务,只要 Service 不退出,Thread 可以一直执行。适合执行独立于 APP 任务,例如,在Service 保持长连接。
24、Activity 异常情况下的生命周期
- 资源相关的系统配置发生改变导致 Activit 被杀死并重新创建,例如横竖屏切换。
- onPause -> onSaveInstanceState() -> onStop -> onDestroy(onPause -> onSaveInstanceState()(onPause 和 OnSaveInstanceState 顺序不一定)
- 重建之后,onCreate -> onStart -> onRestoreInstanceState -> onResume
- 资源内存不足导致低优先级的 Activity 被杀死
同上