一 Activity总结

作者: 落水木木 | 来源:发表于2018-01-25 17:18 被阅读15次

    1.1 是什么

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

    1.2 使用姿势

    1. 继承Activity或其子类,实现需要的生命周期的回调方法;
    2. 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中的过滤信息有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_life.png
    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会被保留下来

    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总结

        本文链接:https://www.haomeiwen.com/subject/orruaxtx.html