一 Activity总结
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 生命周期
activity_life.pngactivity_life2.png
状态的变更和保存
状态变更的时机:
- 主动点击回退。
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