Activity

  • 生命周期

    • 基本生命周期

      • (1)onCreate: 当页面第一次启动时调用, 只调用一次, 一般进行UI的初始化工作

      • (2)onStart: 页面正在启动, 但是位于后台, 不可见

      • (3)onResume: 页面启动了, 位于前台. 用户可见

      • (4)onPause: 页面正在退出, 仍然位于前台, 用户可见但是不可操作

      • (5)onStop: 页面退出了, 位于后台, 用户不可见

      • (6)onDestroy: 页面销毁, 回收Activity实例对象

      • (7)onRestart: 页面因为回到主页面退出到后台再重新返回时执行

    • 执行顺序

      • 页面启动过程

        • onCreate -> onStart -> onResume
      • 点击Home键/点击跳转到其他页面

        • onPause -> onStop
      • 系统内存不足/手动关闭页面/点击返回按钮(调用父类的onBacKPressed方法)

        • (onPause -> onStop ->) onDestroy
      • 点击Home键/点击跳转到其他页面退出后台之后页面重新返回

        • onRestart -> onStart -> onResume
      • 横竖屏切换的生命周期

        • 不配置configChanges=“orientation|screenSize”, 执行横竖屏操作页面会销毁重建

          • onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume
        • 配置configChanges=“orientation|screenSize”: 执行横竖屏操作页面不会销毁重建

          • 不会执行基本生命周期的方法
      • 页面跳转后的生命周期

        • 页面1启动

          • onCreate(页面1) -> onStart(页面1) -> onResume(页面1)
        • 页面1跳转到页面2

          • onPause(页面1) -> onCreate(页面2) -> onStart(页面2) -> onResume(页面2) -> onStop(页面1)
        • 不要在onPause中执行耗时操作(比如读取数据库等), 因为会阻塞下一个页面的启动, 一般只进行资源的释放.注意: 整个生命周期的方法都运行在UI主线程, 都不要进行耗时操作, 否则产生ANR.

      • 页面返回后的生命周期

        • 不重写onBackPressed方法: 当前页面销毁

          • onBackPressed -> onPause -> onStop -> onDestroy
        • 重写onBackPressed方法, 不调用父类的该方法: 当前页面是否销毁由自定义逻辑决定

          • onBackPressed -> 自定义重写的逻辑
  • Activity的通信:

    • 通过Intent对象封装动作行为(目标组件), 以及要传递的数据, 来实现页面之间的跳转通信.

      • 一对一通信

        • 发送

          • (1)创建Intent对象: Intent intent = new Intent();

          • (2)指定动作行为:

            • 显式(3种)

              • 指定目标组件名称: intent.setComponent(new ComponentName(“目标组件所在应用包名”, “目标组件的全限定名”));

              • 指定目标组件的class类名: intent.setClass(this, 目标组件类名.class);

              • 构造Intent:Intent intent = new Intent(当前组件类名.class,目标组件类名.class)

            • 隐示实现方式

              • 自定义action:

              • intent.setAction(“自定义action”);

              • 目标组件配置action标签在AndroidManifest.xml中来响应动作.

                • 调用setAction方法时如果没有指定category类型, 会自动调用addCategory方法加入一个默认的类别, 所以在AndroidManifest.xml的目标组件的中要配置类别标签, 对应默认类别
          • (3)绑定要传输的数据(2种)

            • 直接调用intent.putExtra(k,v)方法传递kv键值对, key的类型可以是基本数据类型,数组以及可序列化对象.

            • 使用Bundle保存数据并传给Intent:bundle.putCharSequence((k,v));intent.putExtra(bundle)

          • (4)正式启动跳转页面::startActivity(intent);

        • Bundle

          • 保存要携带的数据包
        • 响应

          • (1)接收Intent请求对象:Intent intent = getIntent();

          • (2)解析Intent传输的数据

            • 变量名 = getXXXExtra(key); // 部分数据类型还需要提供默认值

            • 使用Bundle获取并保存数据bundle = intent.getExtras();bundle.getString()

          • (3)根据解析的数据进行一些逻辑处理

      • 一对多的通信

        • 通过指定action的形式来指定跳转的动作行为, 即通过隐式跳转来实现

          • (1)发起跳转者:
            Intent intent = new Intent();
            ​intent.setAction(“自定义action”); // 自定义action规范命名: android.intent.action.XXXX
            startActivity(intent);

          • (2)多个组件响应Intent请求:

            • 在AndroidManifest.xml中为需要被启动的每个组件的配置标签, 并且采用自定义的action, 要完全匹配.
      • 多对一的通信

        • (1)正常情况下多个页面和一个页面进行通信为什么失败

          • 正常情况我们使用getIntent方法进行Intent请求的获取, 但是只有在页面的第一次启动执行onCreate方法时会执行

          • 一次setIntent方法来进行页面Intent请求的存储更新, 后续在任何其他基本生命周期中调用setIntent方法都无法更新

          • Intent请求, 导致页面中缓存的Intent对象仍然是第一次传进来的, 所以多对一的通信失败.

        • (2)如何实现多对一的通信, 让setIntent方法更新生效

          • 重写onNewIntent方法, 然后调用setIntent方法传入新的Intent对象来实现多对一的通信, 也就是说只有onNewIntent方法可以成功更新Activity中的Intent缓存对象.
  • Activity的启动模式

    • 任务栈

      • Android系统管理Activity时采用任务栈, 每一个Activity相当于一个任务放到任务栈中.
    • 启动模式

      • (1)standard:默认模式

        • 每一次启动Activity都会创建一个新的Activity实例,置于任务栈栈顶; 默认模式下的所有Activity都在同一个任务栈中.
      • (2)singleTop: 栈顶唯一模式

        • 当启动Activity时, 如果该活动已经位于栈顶, 则不实例化新的Activity; 如果该活动不位于栈顶,则实例化新的Activity并置于栈顶. 当前模式下的所有Activity也都在同一个任务栈中, 同默认模式.
      • (3)singleTask: 任务唯一模式

        • 当启动Activity时, 如果任务栈中存在该任务, 则不会创建新的实例; 如果新活动不位于栈顶, 复用时会把该活动在任务栈前面的Activity全部弹出任务栈. 当前模式下的所有Activity也都在同一个任务栈中, 同以上两种方式.
      • (4)singleInstance: 实例唯一模式

        • 每一个新的Activity都独立位于一个任务栈, 当重复启动同一个Activity时,就是重启原来的任务栈中的活动, 不会创建新的实例. 当前模式会为新的页面创建新的任务栈
  • Activity的常用方法

    • \1. getIntent:

      • 作用

        • 获取跳转传递的Intent请求信息
      • 应用

        • 页面之间进行通信时, 接收Intent请求进行响应
    • \2. onNewIntent:

      • 作用

        • 更新Activity的Intent缓存对象, 从而实现多对一的通信. 前提是被多次启动的Activity不会创建新的实例对象.
      • 应用

        • 页面多对一的通信, 保证一个页面与多个页面进行通信时, 可以得到正确的Intent对象, 进行正确的数据解析
      • 执行顺序

        • onNewIntent -> onReStart -> onStart-> onResume
    • \3. onBackPressed:

      • 作用

        • 当点击页面的返回键时, 执行该方法, 默认情况下, 调用父类的该方法, 返回上一级页面或Home, 然后调用finish方法对当前页面进行销毁.

          • 返回上一级含义

            • 当前页面所在的任务栈中如果存在其他页面, 就返回当前任务栈栈顶的另一个页面; 如果当前页面所在的任务栈中没有任何页面时, 就返回上一次显示的任务栈中的页面.
          • 举例:页面1设置为默认模式, 页面2设置为singleInstance模式, 页面3设置为默认模式.

            • A. 页面1启动页面2, 页面2启动页面3: 此时系统存在两个任务栈, 三个Activity实例, 默认模式的任务栈在前.结果:在页面3点击返回键: 回到页面1.
          • 应用

            • 重写该方法, 不使用父类的该方法

            • 退出Fragment而不是退出Activity: Activity上使用Fragment时, 如果不重写该方法, 点击返回键直接退出了activity, 而我们实际上要退出Fragment, 此时需要重写该方法, 不使用父类的该方法.

            • 传递返回值: 当页面返回到上一级时, 我们如果需要得到相应的数据, 我们可以重写该方法, 然后利用setResult方法实现

    • \4. startActivityForResult, onActivityResult, setResult

      • (1)发起跳转告知要求返回值:

        • startActivityForResult(Intent intent, int requestCode);

          • 第一个参数: 发起跳转的Intent请求

          • 第二个参数: 标识发起跳转想要返回结果的页面

      • (2)返回页面设置返回结果:

        • setResult(int resultCode, Intent data);

          • 第一个参数: RESULT_OK和RESULT_CANCELLED

          • 第二个参数: 要返回给跳转界面的Intent数据信息

      • (3)发起跳转的页面接收返回结果:

        • onActivityResult(int requestCode, int resultCode, Intent data);
          • onActivityResult -> onRestart -> onStart -> onResume
    • \5. finish:

      • 作用

        • 返回上一级页面, 并将当前页面从当前任务栈中销毁踢出, finish方法最终会调用onDestroy来进行销毁, 但是调用onDestroy的时机不固定, 不是立刻执行.
      • 应用

        • 传递返回结果值时, 利用该方法和setResult来实现

        • 当页面不需要再次返回时, 可以在跳转到下个页面时直接使用finish方法, 回收该页面

  • Fragment(碎片)

    • 生命周期

      • Fragment生命周期直接收其宿主Activity的影响。但Activity在运行中可以对Fragment进行增删

        • onAttach:碎片与活动建立关联

        • onCreate

        • onCreateView:创建碎片视图

        • onActivityCreated:与碎片相关联的活动调用完毕

        • onStart

        • onResume

        • onPause

        • onStop

        • onDestroyView:与碎片相关联视图被移除

        • onDestroy

        • onDetach:碎片与活动解除关联

      • 执行顺序

        • 启动

          • onAttach ->onCreate->onCreateView->onActivityCreated->onStart->onResume
        • 替换

          • replace方法

            • addToBackStack

              • onPause->onStop->onDestroyView
            • 没有addToBackStack

              • onPause->onStop->onDestroyView->onDestroy->onDetach
          • add

        • back

          • addToBackStack

            • 按第一次

              • onCreate->onCreateView->onActivityCreated->onStart->onResume
            • 按第二次

              • onPause->onStop->onDestroyView->onDestroy->onDetach
          • 没有addToBackStack

            • onPause->onStop->onDestroyView->onDestroy->onDetach
      • 四种状态

        • 运行

        • 暂停

        • 停止

        • 销毁

    • 创建Fragment

      • 创建Fragment子类继承Fragment重写onCreateView方法
    • 在Activity添加Fragment

      • xml中添加

        • (name属性添加指定fragment):

          • android:name = “全路径类名”,

          • android:id

      • 在Activity运行时添加Fragment

        • 方法

          • 实例化Fragment子类

            • new MyFragment()

              • 销毁后,容易爆空指针
            • MyFragment.newInstance()

              • 使用静态工厂方法,将外部传入的参数可以通过Fragment.setArgument保存在它自己身上
          • 创建Fragment的管理对象fragmentManager。

            • getSupportFragmentManager
          • 获得FragmentTransaction实例

            • fragmentManager.beginTransaction
          • 动态创建Fragment

            • 两种方式

              • beginTransaction.replace();

                • 这种方法每次切换fragment时都会重新初始化
              • beginTransaction.add();

                • 隐藏,不销毁
            • beginTransaction.addToBackStack(null);

              • 加入栈中,退回返回上一个Fragment
          • 提交

            • beginTransaction.commit();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值