Activity生命周期
1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
onSaveInstanceState 在9.0之前是onStop()生命周期之前回调,不一定是在onPause()之前还是之后,在 Android 9 及其之后的版本是在 onStop() 生命周期之后回调。onRestoreInstanceState一定是在onstart()之后调用。
Activity启动模式
standard - 标准模式:创建 Activity 的实例,并 添加到启动它的源 Activity 所在的任务的栈顶。不管栈内或栈顶是否已存在该 Activity 的实例。
singleTop - 栈顶复用模式:当 启动它的源 Activity 所在的任务的栈顶已存在 该 Activity 的实例,那么不创建该 Activity 的新实例 —— 而是走该 Activity 实例的 onNewIntent 回调,注入新的 intent,并执行 onResume(也就是不走 onCreate、onStart)。否则就在栈顶创建一个新实例。
singleTask - 栈内复用模式:当 该 Activity 所属的任务中已存在 该 Activity 的实例,那么不创建该 Activity 的新实例 —— 而是 首先将任务中该 Activity 实例之上的 Activity 全都出栈,并且走该 Activity 实例的 onNewIntent 回调,注入新的 intent,并执行 onResume。否则就在栈顶创建一个新实例。(singleTask Activity 的所属任务,取决于清单中配置的 taskAffinity,如果没有用 taskAffinity 指定任务名,默认是 Activity 所属 App 的默认任务。)
singleInstance - 单例模式:会新建一个任务,并且 独享这个任务。也即 整个系统 有且只有 这么一个 Activity 的实例,多个 App 可共享该实例。
singleInstancePerTask 模式:Android 12 新增 singleInstancePerTask 启动模式,主要是为了更好的支持 “平板、桌面” 等场景下,窗口多开的需求。 singleInstancePerTask 和 singleInstance 的区别在于,一个 Activity 类可以存在多个实例,每个实例都独占一个 task。
standard 邮件、mainfest中没有配置就默认标准模式
singleTop 登录页面 、推送通知栏;
singleTask 程序模块逻辑入口:主页面(Fragment的containerActivity)、WebView页面、扫一扫页面、电商中:购物界面,确认订单界面,付款界面
singleInstance 系统Launcher、锁屏键、来电显示等系统应用
FLAG_ACTIVITY_NEW_TASK,近似于 singleTask 模式。当在清单中为 Activity 设置 taskAffinity 属性时,能跳转到指定任务(若先前不存在该任务,则先创建该任务)。该 FLAG 通常用于从非 Activity 的环境下启动 Activity(这么设计,是为了给 Activity 一个容身之处)。
FLAG_ACTIVITY_SINGLE_TOP ,对应着 singleTop 模式。
FLAG_ACTIVITY_CLEAR_TOP,近似于 singleTask 模式。当该 Activity 已存在于任务中,该 Activity 之上的 Activity 都会出栈,并且该 Activity 如为 standard,则会被重新创建,如为 singleTop,则是走 onNewIntent。
所以 即使 FLAG_ACTIVITY_NEW_TASK 与 FLAG_ACTIVITY_CLEAR_TOP 共同使用,其效果也并不完全等同于 singleTask 模式。
清单文件中,Activity 的属性 allowTaskReparenting = true 意味着该 Activity 可以从一个任务迁移(回)到 taskAffinity 指定的任务。
该属性的存在,主要是为了支持 DeepLink 的使用场景:
例如你通过 浏览器链接 启动了 知乎 的 allowTaskReparenting = true 的 Activity,那么此时该 Activity 处于 浏览器 的任务中;当通过 Home 键让 浏览器任务脱离焦点,并从桌面启动知乎时,由于该 Activity 被指定的 taskAffinity 值与 知乎 的任务一致,因而该 Activity 又会被迁移回 知乎 的任务中继续展示。
activity横竖屏切换时activity的生命周期,view的生命周期
1、不配置configChanges时:切换横竖屏时生命周期各自都会走一遍。
2、配置configChanges时:必须设置为android:configChanges="orientation|screenSize"时,才不会重走生命周期方法,只会回调onConfigurationChanged方法,注意,不配置configChanges或是配置了但不同时包含这两个值时,都会重走一遍生命周期方法,并且不会回调onConfigurationChanged方法。
3、另外重走生命周期方法时,还会调用onSaveInstanceState() 与onRestoreIntanceState(),资源相关的系统配置发生改变或者资源不足:例如屏幕旋转,当前Activity会销毁,并且在onStop之前回调onSaveInstanceState保存数据,在重新创建Activity的时候在onStart之后回调onRestoreInstanceState。其中Bundle数据会传到onCreate(不一定有数据)和onRestoreInstanceState(一定有数据)。用户或者程序员主动去销毁一个Activity的时候不会回调,其他情况都会调用,来保存界面信息。如代码中finish()或用户按下back,不会回调。
五种进程
第一高:前台进程
前台进程是Android系统中最重要的进程,是与用户正在交互的进程。
第二高:可见进程
可见进程指部分程序界面能够被用户看见,却不在前台与用户交互。
第三高:服务进程
一个包含已启动服务的进程就是服务进程,服务没有用户界面,不与用户直接交互,但能够在后台长期运行,提供用户所关心的重要功能。
第四高:后台进程
如果一个进程不包含任何已经启动的服务,而且没有用户可见的Activity,则这个进程就是后台进程。
第五高:空进程
空进程是不包含任何活跃组件的进程。在系统资源紧张时会被首先清楚。
动画
Android中的动画有哪几类,它们的特点和区别是什么?
Android中动画大致分为3类:帧动画、补间动画(Tween Animation)、属性动画(Property Animation)。
帧动画:通过xml配置一组图片,动态播放。很少会使用。
补间动画(Tween Animation):大致分为旋转、透明、缩放、位移四类操作。很少会使用。
属性动画(Property Animation):属性动画是现在使用的最多的一种动画,它比补间动画更加强大。属性动画大致分为两种使用类型,分别是 ViewPropertyAnimator 和 ObjectAnimator。前者适合一些通用的动画,比如旋转、位移、缩放和透明,使用方式也很简单通过 View.animate() 即可得到 ViewPropertyAnimator,之后进行相应的动画操作即可。后者适合用于为我们的自定义控件添加动画,当然首先我们应该在自定义 View 中添加相应的 getXXX() 和 setXXX() 相应属性的 getter 和 setter 方法,这里需要注意的是在 setter 方法内改变了自定义 View 中的属性后要调用 invalidate() 来刷新View的绘制。之后调用 ObjectAnimator.of 属性类型()返回一个 ObjectAnimator,调用 start() 方法启动动画即可。
补间动画与属性动画的区别:
补间动画是父容器不断的绘制 view,看起来像移动了效果,其实 view 没有变化,还在原地。
属性动画是通过不断改变 view 内部的属性值,真正的改变 view。
TimeInterpolator(时间插值器)
作用:根据时间流逝的百分比计算出当前属性值改变的百分比。
系统已有的插值器:
1、LinearInterpolator(线性插值器):匀速动画。
2、AccelerateDecelerateInterpolator(加速减速插值器):动画两头慢,中间快。
3、DecelerateInterpolator(减速插值器):动画越来越慢。
TypeEvaluator(类型估值算法,即估值器):
作用:根据当前属性改变的百分比来计算改变后的属性值。
系统已有的估值器:
IntEvaluator:针对整型属性
FloatEvaluator:针对浮点型属性
ArgbEvaluator:针对Color属性