Activity总结和补充

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容