Activity 相关知识点
Activity 生命周期
onCreate()
: 正在被创建,常用来初始化工作onStart()
:正在被启动,此时可见但不在前台,无法与用户交互onResume()
:获得焦点,此时可见且在前台onPause()
:正在停止,此时可做一些存储数据、停止动画等工作,但是不能太耗时,因为这会影响到新 Activity 的显示, onPause 必须先执行完,新 Activity 的 onResume 才会执行onStop()
:即将停止,可以做一些稍微重量级的回收工作,比如注销广播接收器、关闭网络连接等,同样不能太耗时onDestroy()
:即将被销毁,这是 Activity 生命周期中的最后一个回调,常做回收工作、资源释放;onRestart()
:正在重新启动,一般情况下,当前 Acitivty 从不可见重新变为可见时,OnRestart 就会被调用;
延伸:
- 从整个生命周期来看,onCreate 和 onDestroy 是配对的,分别标识着Activity 的创建和销毁,并且只可能有一次调用
- 从 Activity 是否可见来说,onStart 和 onStop 是配对的,这两个方法可能被调用多次
- 从 Activity 是否在前台来说,onResume 和 onPause 是配对的,这两个方法可能被调用多次;
Activity A 启动另一个Activity B 会调用哪些方法
- Activity A 的
onPause()
→ - Activity B 的
onCreate()
→onStart()
→onResume()
→ - Activity A 的
onStop()
如果B是透明主题又或者是个DialogActivity,则不会回调 A 的onStop
onSaveInstanceState() 方法的作用 ? 何时会被调用?
调用时机:
- 系统配置发生改变时导致 Activity 被杀死
- 内存资源不足导致低优先级的 Activity 被杀死
以上两种场景下会调用该方法,保存当前 Activity 的状态。当 Activity 被重建后,系统会调用 onRestoreInstanceState()
,并且把onSaveInstanceState()
方法所保存的 Bundle 对象同时传参给 onRestoreInstanceState()
,因此可以在这个方法中进行资源恢复操作。
横竖屏切换的 Activity 生命周期变化
- 默认情况下,系统会销毁并重新创建 Activity,以适应新的屏幕方向,生命周期如下
onPause onSaveInstanceState onStop onDestroy onCreate onStart onRestoreInstanceState onResume
- 添加 configChanges 属性可避免该销毁重建的默认行为
此时,横竖屏切换后不再重建Activity。同时会调用如下方法:<activity android:name=".YourActivity" android:configChanges="orientation|screenSize"> <!-- 其他配置 --> </activity>
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); }
Activity的四种启动模式、应用场景
- standard (标准模式):
- 行为:每次启动一个 Activity 都会重新创建一个新的实例
- 应用场景:适用于大多数常规Activity
- singleTop (栈顶复用模式):
- 行为:如果新的 Activity 已经位于任务栈的顶部,则不会创建新的实例,而是调用其
onNewIntent()
方法 - 应用场景:适用于需要避免重复创建实例的场景,如消息通知的详情页
- 行为:如果新的 Activity 已经位于任务栈的顶部,则不会创建新的实例,而是调用其
- singleTask (栈内复用模式):
- 行为:在整个任务栈中,该 Activity 只会有一个实例。如果任务栈中已存在该 Activity 的实例,则系统会将位于该实例之上的所有 Activity 出栈,并使其获得焦点,也会调用其
onNewIntent()
方法 - 应用场景:适用于作为应用入口的 Activity,如主界面、登录页面等
- 行为:在整个任务栈中,该 Activity 只会有一个实例。如果任务栈中已存在该 Activity 的实例,则系统会将位于该实例之上的所有 Activity 出栈,并使其获得焦点,也会调用其
- singleInstance (单实例模式):
- 行为:与 singleTask 类似,但整个系统中只会有一个实例,并且该实例会运行在一个新的任务栈中
- 应用场景:通常用于系统级应用,如来电显示、系统锁屏界面等
Activity 的视图层级
Activity 启动流程
- 启动
Activity
的请求会由Instrumentation
来处理,它通过Binder
向AMS
发送请求 AMS
内部维护着一个ActivityStack
并负责栈内的Activity
状态同步AMS
通过ActivityThread
去同步Activity
的状态从而完成生命周期方法的调用
Serializable 和 Parcelable 的区别
Serializable
是Java
实现,Parcelable
是Android
特有Serializable
使用简单但开销较大,需要大量 IO 操作Parcelable
使用麻烦但性能较高,是对一个对象进行分解,它分解后的每一部分内容Intent
都是支持的- 内存序列化使用
Parcelable
,文件存储或网络传输使用Serializable