1.1 是什么
安卓应用程序的主要组件之一,用于与用户交互并完成某些任务。app的主要功能模块往往由几个松耦合的activity组成。
1.2 使用姿势
- 继承Activity或其子类,实现需要的生命周期的回调方法;
- 在
manifest文件中声明:
<activity
android:name=".activity.ExtraToolActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
1.2.1 启动与回收
1.2.1.1 launcher启动
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
1.2.1.2 显式调用
调用startActivity(params)方法。
1.2.1.3 隐式调用
IntentFilter匹配
IntentFilter中的过滤信息有action、category、data三种匹配信息。三类同时匹配成功才能启动Activity。
action匹配:匹配任意一个,区分大小写。
category匹配:Intent中所有category都必须在过滤列表中找到匹配。没写category就是默认的android.intent.category.DEFAULT。
data匹配:data中有scheme、host、port、path、pathPattern、pathPreffix、mimeType等属性。匹配规则是必须有data数据且在过滤列表中完全匹配。且必须有scheme属性(image/*和text/*类型默认为content和file)。
任何启动方式都需要先在manifest文件声明activity。
1.2.2 模块间通信
Intent通信。包括startActivityForResult(params)。
EventBus通信。
1.3 生命周期


状态的变更和保存
状态变更的时机:
- 主动点击回退。
onPause->onStop->onDestroy->onCreate->onStart->onResume - Home键返回首页。
onPause—>onSaveInstanceState(Bundle)(不保证被调用)->onStop—->onRestart——>onStart—–>onResume - activity被意外销毁时。比如内存不足。
- 旋转屏幕。
app转屏时的生命周期:onCreate->onStart->onResume-> Running 转屏 ->onPause->onSaveInstanceState(Bundle)->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState(Bundle)->onResume
onCreate(Bundle)和onSaveInstanceState(Bundle)取得的是相同的参数。
onSaveInstanceState一定在onStop之前调用,但是不确定是否在onPause之前。
ui状态的保存
onSaveInstanceState和onRestoreInstanceState分别用于保存、恢复组件状态。
onSaveInstanceState的默认实现会自动为有android:id的ui组件保存状态,底层用Parcerable和Bundle。
存在不需要保存状态的情况(比如用户主动点击返回键),onSaveInstanceState不保证一定被调用。
持久性数据的保存
onSaveInstanceState不稳定,可以在onPause()中将有必要的数据保存到数据库等。
使用Fragment保存数据
Bundle并非设计来携带大型对象(比如位图),而且其中数据必须先序列化再反序列化会消耗大量系统资源。因此可以用Fragment保存数据,减轻Activity的负担。
因设备配置改变,造成activity被销毁的情况下(比如旋转屏幕),设置了setRetainInstance(true)的Fragment会被保留下来

android:configChanges
android:configChanges="xxx"属性,常用的主要有下面三个选项:
local:设备的本地位置发生了变化,一般指切换了系统语言;
keyboardHidden:键盘的可访问性发生了变化,比如用户调出了键盘;
orientation:屏幕方向发生了变化,比如旋转了手机屏幕。
配置了android:configChanges="xxx"属性之后,Activity就不会在对应变化发生时重新创建,而是调用Activity的onConfigurationChanged方法。
1.4 启动模式
standard
每次启动创建新的实例。
新启动的activity属于启动它的任务栈。singleTop栈顶复用模式
只会复用栈顶的实例。
启动的activity如果在栈顶,则复用它并回调onNewIntent(Bundle)。
启动的activity如果在栈中有实例,但是不在栈顶,会新建一个实例(同standard)。
其他情况同standard。singleTask栈内复用
启东时去对应的栈内寻找实例,找到则复用并回调onNewIntent,并将之上的activity全部出栈。
栈内找不到则新建实例。
找不到栈则创建任务栈。
不同应用的activity可以被指定到同一个栈中,只要设置相同的android:taskAffinity。singleInstance单例模式
启动时会新建特殊的任务栈并将activity入栈,复用时回调onNewIntent。
ActivityInfo的taskAffinity属性
1.标识一个Activity的任务栈名,默认所有任务栈名为应用包名;
2.任务的affinity取决于其root activity的taskAffinity;
3.可以在manifest为Activity单独指定taskAffinity,相同的为同一任务栈,为空则不属于任何任务栈。
1.5 场景用例
singleTop适用于展示消息通知等。
singleTask适用于程序主页等,也可以用于搜索页。
singleInstance适用于完全独立的页面。
1.6 启动流程源码分析
略
参考文章
activity状态
泽毛-Activity 知识梳理(3) - Activity状态保存和恢复
一大三千-Android学习之保存 Activity 的状态
暗暗笑-Activity : 状态保存与恢复
jxq1994-Activity状态的几种保存方法
Hujiawei-Art of Android Development Reading Notes 1