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. 作用
显示界面 & 与用户进行交互
- 一个
Activity
通常是一个界面,是四大组件唯一能被用户感知的
Activity 相当于pane(面板),控件放在其上显示.我们看到的APP界面,其实就是由activity和控件组成的.- 每个活动被实现为一个独立的类, & 从活动基类继承过来
2. 生命周期(状态)
生命周期就是Activity各种状态。
activity: 切换界面,activity 压栈。activity state:onCreate(创建) 、onStart(激活) 、onResume(恢复) 、onPause(暂停) 、onStop(停止) 、onDestroy(销毁) 、onRestart(重启)。
notes:onCreate 生命周期主要进行初始化操作,onResume执行完毕以后页面才会展示出来.
其中,有三个稳定态,其他都是过渡态:
- 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) 直接调用
- 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