- 基本概念
- AndroidManifest 配置
- 生命周期
- 保留实例状态
- Activity 之间的导航
- Activity 状态更改
- 配置更改
- Activity 或对话框显示在前台
- 点击返回按钮
- 任务和返回堆栈
- 管理任务
- 进程和应用生命周期
简单理解:用户界面,MVC 中属于 Controller,Activity 经常会启动属于其它应用的 Activity。
AndroidManifest 配置下面是 Activity 在 manifest 中的基本配置:
生命周期
如下图所示,展示了 Activity 的生命周期:
onCreate ==> onStart ==> onResume ==> onPause ==> onStop ==> onDestroy onStop ==> onRestart ==> onStart
一些细节:
1、暂停和停止状态的一些区别:
暂停时 Activity 是部分或者完全可见的;==> 启动新的对话框或者透明的 Activity 在某个 Activity 上;
停止时 Activity 是完全不可见的;
2、设备上有很多应用,但任何时候只能有一个 Activity 处于能与用户交互的运行状态;
3、在对应的生命周期中初始和释放资源,如:onStart <===> onStop;onResume <===> onPause;
保留实例状态应组合使用持久性本地存储、onSaveInstanceState、ViewModel类来保存数据;
-
onSaveInstanceState
该方法默认实现保存有关 Activity 视图层次结构状态的瞬时信息,例如:EditText 微件中的文本或 ListView 微件的滚动位置;
用户显示关闭 Activity 或者调用 finish 时,系统不会调用 onSaveInstanceState 方法;
-
onRestoreInstanceState
call after onStart,可以选择是在 onCreate 还是 onRestoreInstanceState 中恢复信息;
这里不需要检查 Bundle 是否为 null,因为只有需要恢复信息的时候才会调用该方法;
导航到新 Activity:
-
startActivity(Intent)
-
startActivityForResult(Intent, requestCode: int)
从启动的 Activity 中获取返回的结果;第二个参数用于消除多次调用的歧义;
子 Activity 使用 setResult(int)将数据返回到父级;
父 Activity 使用 onActivityResult(requestCode: int, resultCode: int, data: Intent?)接收数据;
启动另一个 Activity 时生命周期方法调用过程:
A.onPause ==> B.onCreate ==> B.onStart ==> B.onResume ==> A.onStopActivity 状态更改 配置更改
触发配置更改的事件:
横屏和竖屏之间的变化、多窗口模式、语言或输入设备的改变;
在设备配置改变时,会先销毁 Activity ,然后创建 Activity,为新配置寻找最佳资源;多窗口模式,也只有一个应用处于前台,即一个 onResume ,一个 onPause。
Activity 或对话框显示在前台部分覆盖:onPause
全部覆盖:onStop
点击概览或主屏幕时,系统的行为就好像当前 Activity 已被完全覆盖一样;
点击返回按钮返回按钮会销毁 Activity ,并且从返回堆栈中移除;该情况下默认不会触发 onSaveInstanceState回调;实现onBackPressed可以自定义该行为,但同时应该调用父类方法。
任务和返回堆栈任务:
- 启动新应用,如果该应用没有任务存在,则会创建新任务;
- 任务是一系列 Activity 的集合,按照打开顺序排列在一个返回堆栈中;
- 堆栈中的 Activity 不会被重新排列,只会被送入和退出;
定义启动模式:
-
使用清单文件
通过 标签指定 android:launchMode属性选择启动模式;
- standard,默认,每次启动都会创建新的 Activity 的实例,在返回栈中入栈;
- singleTop,Activity 处于返回栈栈顶时不会再创建新的 Activity;
- singleTask,检查返回栈中是否存在对应 Activity 的实例,将之上的 Activity 出栈;没有则创建;
- singleInstance,启用新的返回栈管理 Activity;
- singleInstancePerTask,android 12 上可检验;
-
使用 Intent 标记
-
FLAG_ACTIVITY_NEW_TASK == singleTask
-
FLAG_ACTIVITY_SINGLE_TOP == singleTop
-
FLAG_ACTIVITY_CLEAR_TOP 如果要启动的 Activity 已经在当前任务中运行,则销毁位于它之上的所有 Activity;
-
优先遵循 Activity A 的请求(Intent 中的定义),而不是 Activity B 的请求(在清单中的定义);
处理亲和性:
亲和性表示 Activity 倾向于属于哪个任务;
使用的taskAffinity属性修改任何给定的 Activity 的亲和性;
清除返回堆栈:
如果用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity;
- alwaysRetainTaskState,设置为 True,则不会发生上述默认行为;
- clearTaskOnLaunch,一旦离开再返回就会被清除只剩根 Activity;
- finishOnTaskLaunch,作用于单个 Activity ,包括根 Activity,只要离开任务将不再存在;
前台进程:
- 互动屏幕上运行一个 Activity;
- BroadcastReceiver 正在运行;
- Service 正在执行某个回调;
可见进程:
- 运行的 Activity 可见,但不在前台;
- Service 正在通过 Service.startForeground;
- 系统正在使用其托管的服务;
服务流程:
- 无法看到的 Service;
缓存进程:
- 目前不需要的进程;



