一 Activity总结

1.1 是什么

安卓应用程序的主要组件之一,用于与用户交互并完成某些任务。app的主要功能模块往往由几个松耦合的activity组成。

1.2 使用姿势

  1. 继承Activity或其子类,实现需要的生命周期的回调方法;
  2. manifest文件中声明:

1.2.1 启动与回收

1.2.1.1 launcher启动

 
                
                
            

1.2.1.2 显式调用

调用startActivity(params)方法。

1.2.1.3 隐式调用

IntentFilter匹配

IntentFilter中的过滤信息有actioncategorydata三种匹配信息。三类同时匹配成功才能启动Activity。
action匹配:匹配任意一个,区分大小写。
category匹配:Intent中所有category都必须在过滤列表中找到匹配。没写category就是默认的android.intent.category.DEFAULT
data匹配:data中有schemehostportpathpathPatternpathPreffixmimeType等属性。匹配规则是必须有data数据且在过滤列表中完全匹配。且必须有scheme属性(image/*text/*类型默认为content和file)。

任何启动方式都需要先在manifest文件声明activity

1.2.2 模块间通信

Intent通信。包括startActivityForResult(params)
EventBus通信。

1.3 生命周期

一 Activity总结_第1张图片
activity_life.png

一 Activity总结_第2张图片
activity_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状态的保存

onSaveInstanceStateonRestoreInstanceState分别用于保存、恢复组件状态。

onSaveInstanceState的默认实现会自动为有android:id的ui组件保存状态,底层用ParcerableBundle
存在不需要保存状态的情况(比如用户主动点击返回键),onSaveInstanceState不保证一定被调用。

持久性数据的保存

onSaveInstanceState不稳定,可以在onPause()中将有必要的数据保存到数据库等。

使用Fragment保存数据

Bundle并非设计来携带大型对象(比如位图),而且其中数据必须先序列化再反序列化会消耗大量系统资源。因此可以用Fragment保存数据,减轻Activity的负担。
因设备配置改变,造成activity被销毁的情况下(比如旋转屏幕),设置了setRetainInstance(true)的Fragment会被保留下来

一 Activity总结_第3张图片
restore_instance.png

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

ActivityInfotaskAffinity属性
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

启动模式
猴子搬来的救兵Castiel-彻底弄懂Activity四大启动模式

你可能感兴趣的:(一 Activity总结)