前言介绍
关于Activity完全分析及其应用场景的介绍。
Benhero的博客地址:
正文
onStart和onResume有什么区别?onPause和onStop有什么区别?打开一个新Activity时的回调顺序?
4种启动模式的含义?
任务栈的作用?Activity一定会放入其taskAffinity属性所声明的栈中吗?
一. 生命周期
onCreate:生命周期内只调用1次,用于初始化界面、必要对象创建、基础逻辑、恢复数据、注册广播等
onStart:界面由完全不可见(不包括被透明界面遮挡)变为可见时调用,利用这个特性处理一些业务逻辑
onResume:界面可点击交互,不被顶层其他任何Activity遮挡;开始执行界面交互操作
onPause:界面不可点击交互,被其他Activity遮挡,部分可见;此时应当停止交互相关等耗资源的操作,如动画、相机等
onStop:界面完全不可见;保存重要数据,而不在onDestroy中执行,因为Activity在后台时进程被杀,则不调用
onDestroy:生命周期内只调用1次,界面完全销毁,用于执行资源释放、反注册广播等
onRestart:界面由stopped状态下被再次打开时调用
Tips:注册、反注册应当在成对的生命周期回调方法里执行
当从Activity A打开一个透明属性的Activity B时,A只会调用onPause方法,而onStop不会调用。此时,A处于部分可见状态,但不可交互。同理,此时按返回键关闭B返回A,只会调用A的onResume方法。
从A打开B,若B不带透明属性:方法调用顺序如下:A.onPause → B.onCreate → B.onStart(B开始可见)→ B.onResume → A.onStop。所以两个方法还是有所区分侧重的,两个方法都不当做耗时操作,特别是onPause方法,会影响界面B的打开,所以稍微重点的计算操作方到onStop中,耗时的当然是异步处理。
保存状态:在onStop方法之前,系统会调用onSaveInstanceState方法,在此处存储状态。
恢复状态:在onCreate方法里进行恢复,要先对参数savedInstanceState进行判空。也可以在onRestoreInstanceState方法里进行恢复,该方法在onStart之后调用,并且只有数据需要恢复时系统才会调用,所以此处savedInstanceState无需判空。
三. LaunchMode-启动模式
用于组合存放Activity
采用“后进先出”的栈结构
栈的拼接:从栈A启动栈B后,按返回键,则先将栈B回退到空之后,再进入栈A。可见图示官方文档
查看信息命令: adb shell dumpsys activity
B目标栈为S2,S2不存在:则创建S2,并将B加入到栈中。standard和singleTop不具备该特性。
B目标栈为S1(或S2),S1(或S2)存在,栈内无B:创建B放入栈顶。
B目标栈为S1(或S2),S1(或S2)存在,栈内有B:复用B,清空B之上的Activity,回调onNewIntent方法。
4.singleInstance:单实例模式:单独位于一个任务栈中,栈中不会有其他Activity,单例,你懂的,还是onNewIntent。
FLAG_ACTIVITY_NEW_TASK:效果不等同于”singleTask”!!!(《Android开发艺术探索》此书对于这点有误)
验证方式:Manifest中配置为singleTask的Activity,通过一个application的context来启动一个声明为singleTask的Activity来进行测试,会报错。因为在解析目标Activity属性之前,系统对context进行检测,导致报错,位于源码中的ContextImpl.startActivity方法中。
正确理解如下(通过源码理解测试):
打开的Activity的目标栈如果不存在,则创建栈,并且把Activity放到栈中。
打开的Activity的目标栈如果存在,则再分两种情况:
Activity未打开过:创建Activity放入栈顶;
Activity已经打开过(无论是否被销毁),只会将该栈移动到前台,不会创建新的Activity。(比如A、B同个目标栈,先打开A,A打开B,此时若B打开A,则是没有反应的,不会跳转到A)
FLAG_ACTIVITY_SINGLE_TOP:效果如”singleTop”
FLAG_ACTIVITY_CLEAR_TOP:singleTask自带该效果。
特别组合:被启动的Activity使用standard模式,则会将它以及它以上的Activity都出栈,创建新的Activity放入栈中。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不出现在多任务列表中。
Benhero的博客链接:
终端研发部提倡: 没有做不到的,只有想不到的。
在这里获得的不仅仅是技术!
让心,在阳光下学会舞蹈
让灵魂,在痛苦中学会微笑
—终端研发部—
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部
这里学到的不仅仅是技术
原文来自:gcode1024byte
通过出发地、目的地、出发日期等信息查询航班信息。
通过站到站查询火车班次时刻表等信息,同时已集成至聚合MCP Server。火车票订票MCP不仅能赋予你的Agent火车时刻查询,还能支持在线订票能力。
通过车辆vin码查询车辆的过户次数等相关信息
验证银行卡、身份证、姓名、手机号是否一致并返回账户类型
查询个人是否存在高风险行为