美文网首页
Activity总结和补充

Activity总结和补充

作者: mfdalf | 来源:发表于2020-12-05 16:05 被阅读0次

    Android 四大组件:activity显示,service后台服务,broadcast通信, contentProvider 数据共享.
    相关系列文章:
    Android Binder&Aidl理解和补充:https://www.jianshu.com/p/eb791ae04e2f
    Service史上最全面解析》理解和补充: https://www.jianshu.com/p/444af9739135
    Handler总结和补充:https://www.jianshu.com/p/a041c41af27d

    目录

    image

    本文是读Android四大组件:这是一份全面 & 详细的Activity学习指南
    https://blog.csdn.net/carson_ho/article/details/82848840 读后感

    1. 作用

    显示界面 & 与用户进行交互

    1. 一个Activity通常是一个界面,是四大组件唯一能被用户感知的
      Activity 相当于pane(面板),控件放在其上显示.我们看到的APP界面,其实就是由activity和控件组成的.
    2. 每个活动被实现为一个独立的类, & 从活动基类继承过来

    2. 生命周期(状态)

    生命周期就是Activity各种状态。
    activity: 切换界面,activity 压栈。activity state:onCreate(创建) 、onStart(激活) 、onResume(恢复) 、onPause(暂停) 、onStop(停止) 、onDestroy(销毁) 、onRestart(重启)。
    notes:onCreate 生命周期主要进行初始化操作,onResume执行完毕以后页面才会展示出来.


    image

    其中,有三个稳定态,其他都是过渡态:

    • Resumed ,此时,Activity处于栈顶,处理用户交互。
    • Paused,当Activity的一部分被挡住的时候进入这个状态,不会与用户交互。
    • Stopped,当Activity完全被覆盖时进入这个状态,此时Activity不可见,仅在后台运行。
      image
      详见:Android基础:3分钟详解Activity生命周期 https://blog.csdn.net/carson_ho/article/details/82620404
      每种状态有不同的作用,不同的应用场景有不同的状态变化,状态的变化就是作用的变化.
      scenario1: 第一次打开app.
      onCreate()-->onStart()-->onResume()。
      scenario2: activity被回收,重启打开activity
      ​​​​​​这属于第二次打开,不同于第一次打开。这次打开在onCreate的时候,会带有上次被回收的时候保存的bundle.
      那么bundle是谁?是什么时候保存的呢?是onSaveInstanceState函数,在app被回收的时候,android os会调这个函数,通常开发人员在这个函数中需要写一些要保存的内容。
      QA:什么情况会调用onSaveInstanceState?
      比如:进程因为内存不足被回收的时候和横屏,竖屏转换的时候.
      使用back键正常退出app,不会调用onSaveInstanceState.
      Activity中的onSaveInstanceState()解析:https://blog.csdn.net/qq_31753145/article/details/51460663.
      上文主要内容: 1) onSaveInstanceState:a) back原先的 Activity 的界面; b) onPause()和onSaveInstanceState()区别;
      c) default onSaveInstanceState()和自己实现onSaveInstanceState() d) onSaveInstanceState 什么时候被调用。
      QA: 回收的优先级
      Android进程回收优先级:https://my.oschina.net/JiangTun/blog/1557987
      scenario3: 两个activity跳转状态变化?
      当在 A 里面激活 B 的时候, A 会调用 onPause() 方法, 然后 B 调用 onCreate()-->onStart()-->onResume().
      这时候 B 覆盖了窗体, A 会调用 onStop() 方法.
      image
      scenario5:锁屏,开屏
      锁屏:onPause--onSaveInstanceState--onStop
      开屏:onResume
      scenario6:直接按home返回主界面
      pause--->stop
      再次打开app
      restart--->start---resume
      activity压入栈重新被唤起,不同的模式,有不同的启动时序,详细参见: https://blog.csdn.net/my_csdnboke/article/details/84787281 中的第二部分.
      scenario7:按back键返回主界面
      pause--->stop--->destory
      scenario8:横竖屏切换
      onCreate()、onStart()、onResume(),onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()

    3 缓存方式(状态保存)

    示意图

    4. 启动模式

    • Activity的启动模式有4种,具体如下
      image
      任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名.
    • standard,标准模式,每次都会创建新的Activity覆盖在原Activity上
      image
    • singleTop,栈顶复用模式,首先判断栈顶Activity是否是要启动的Activity,如果是则不创建新的Activity而直接引用这个Activity;如果不是则创建新的Activity。
      image
    • singleTask,栈内复用模式,检测整个Activity栈中是否存在当前需要启动的Activity,如果存在则将该Activity置于栈顶,并销毁其上所有Activity。
    • image
    • singleInstance,单实例模式,创建新的任务栈,且该任务栈仅有一个Activity。
      image
      4种启动模式的区别
      示意图
      4 种模式的适用场景
      image
      启动模式配置 <activity android:label="@string/app_name" android:launchmode="singleTask" android:name="Activity1">
      </activity>

    5 启动方式

    参见原文,这个是activity通信的基础。
    从一个first activity跳转到second activity,道理是一样的.指定类名即可.
    Intent intent = new Intent(this,SecondActivity.class);
    startActivity(intent);

    6 启动过程

    参见原文,同时参见https://blog.csdn.net/u012267215/article/details/91406211

    7 Fragment

    activity 是整个屏幕,fragment是分屏.详细参见:https://blog.csdn.net/carson_ho/article/details/51588609

    8 Activity通信

    直接调用,多线程用intent通信,多进程用aidl.
    (1) 直接调用

    1. Activity与Fragment通信:
      i) activity到fragment
      因为fragment是activity的一个成员,直接调用变量传递数据,数据格式是bundle.
      ii) fragment到activity
      a) activity向fragment传入callback对象(通常是匿名类).
      b) fragment 向callback对象的函数,传入变量var即设置变量var.
      c) activity中callback对象的函数中获取了,fragment的传值.
      原理类似主函数向子函数中传入指针,指针在子函数中被赋值,这样主函数中使用指针就是最新的值.
      碎片之间通信:不能通信,fragment依赖于activity,通过activity通信
      (2) 基于intent传输
      两个activity之间:通信使用intent机制,bundle结构。可能带参数,参见https://jingyan.baidu.com/article/f79b7cb37b60229144023ed9.html
      activity和本地service通信:intent 属于线程通信
      (3) 基于外部存储的传c输,file/preference/sqlit,如果要针对第三方应用需要Content provider
      (4) 基于ipc的通信机制(例如:context与service之间的传输,如Activity与service之间的通信(aidl))
      activity和远程service通信:aidl 属于进程通信
      (5) 基于Application的context(例如:将要传递的数据存在父类activity中)
      (6) 使用static 变量通信(不推荐,app被回收,重新启动,页面的启动不会走默认的流程,而是会直接打开上次离开时的页面,而这个static 变量就会为 null造成错误。static变量一起保存能解决这个问题吗??).

    其他参考:activity的简要介绍:https://www.jianshu.com/p/35fd45135d99

    相关文章

      网友评论

          本文标题:Activity总结和补充

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