基本概念
??简单理解:用户界面,MVC 中属于 Controller,Activity 经常会启动属于其它应用的 Activity。
AndroidManifest 配置
下面是 Activity 在 manifest 中的基本配置:
<application ...>
<activity android:name=".ExampleActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
生命周期
如下图所示,展示了 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 之间的导航
导航到新 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.onStop
Activity 状态更改
配置更改
触发配置更改的事件: ??横屏和竖屏之间的变化、多窗口模式、语言或输入设备的改变;
??在设备配置改变时,会先销毁 Activity ,然后创建 Activity,为新配置寻找最佳资源;多窗口模式,也只有一个应用处于前台,即一个 onResume ,一个 onPause。
Activity 或对话框显示在前台
部分覆盖:onPause
全部覆盖:onStop
点击概览或主屏幕时,系统的行为就好像当前 Activity 已被完全覆盖一样;
点击返回按钮
??返回按钮会销毁 Activity ,并且从返回堆栈中移除;该情况下默认不会触发 onSaveInstanceState 回调;实现onBackPressed 可以自定义该行为,但同时应该调用父类方法。
任务和返回堆栈
任务:
- 启动新应用,如果该应用没有任务存在,则会创建新任务;
- 任务是一系列 Activity 的集合,按照打开顺序排列在一个返回堆栈中;
- 堆栈中的 Activity 不会被重新排列,只会被送入和退出;
管理任务
定义启动模式:
??优先遵循 Activity A 的请求(Intent 中的定义),而不是 Activity B 的请求(在清单中的定义);
处理亲和性: ??亲和性表示 Activity 倾向于属于哪个任务; ???使用<activity /> 的taskAffinity 属性修改任何给定的 Activity 的亲和性;
清除返回堆栈: ??如果用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity;
alwaysRetainTaskState ,设置为 True,则不会发生上述默认行为;clearTaskOnLaunch ,一旦离开再返回就会被清除只剩根 Activity;finishOnTaskLaunch ,作用于单个 Activity ,包括根 Activity,只要离开任务将不再存在;
进程和应用生命周期
前台进程:
- 互动屏幕上运行一个 Activity;
- BroadcastReceiver 正在运行;
- Service 正在执行某个回调;
可见进程:
- 运行的 Activity 可见,但不在前台;
- Service 正在通过
Service.startForeground ; - 系统正在使用其托管的服务;
服务流程:
缓存进程:
|