2024年终总结:这是一份面向Android工程师的面试大纲,2024年最新适合面试看的书

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

  • onPreExecute():异步任务开启之前回调,在主线程中执行
  • doInBackground():执行异步任务,在线程池中执行
  • onProgressUpdate():当doInBackground中调用publishProgress时回调,在主线程中执行
  • onPostExecute():在异步任务执行之后回调,在主线程中执行
  • onCancelled():在异步任务被取消时回调

3、AsyncTask工作原理

4、AsyncTask引起的内存泄漏

  • 原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放
  • 解决:
  • AsyncTask内部持有外部Activity的弱引用
  • AsyncTask改为静态内部类
  • AsyncTask.cancel()

5、AsyncTask生命周期

在Activity销毁之前,取消AsyncTask的运行,以此来保证程序的稳定

6、AsyncTask结果丢失

由于屏幕旋转、Activity在内存紧张时被回收等情况下,Activity会被重新创建,此时,旧的AsyncTask持有旧的Activity引用,这个时候会导致AsyncTask的onPostExecute()对UI更新无效

7、AsyncTask并行or串行

  • AsyncTask在Android 2.3之前默认采用并行执行任务,AsyncTask在Android 2.3之后默认采用串行执行任务
  • 如果需要在Android 2.3之后采用并行执行任务,可以调用AsyncTask的executeOnExecutor()

HandlerThread面试题


1、HandlerThread产生背景

当系统有多个耗时任务需要执行时,每个任务都会开启一个新线程去执行耗时任务,这样会导致系统多次创建和销毁线程,从而影响性能。为了解决这一问题,Google提供了HandlerThread,HandlerThread是在线程中创建一个Looper循环器,让Looper轮询消息队列,当有耗时任务进入队列时,则不需要开启新线程,在原有的线程中执行耗时任务即可,否则线程阻塞

2、HanlderThread的特点、

  • HandlerThread本质上是一个线程,继承自Thread
  • HandlerThread有自己的Looper对象,可以进行Looper循环,可以创建Handler
  • HandlerThread可以在Handler的handlerMessage中执行异步方法
  • HandlerThread优点是异步不会堵塞,减少对性能的消耗
  • HandlerThread缺点是不能同时继续进行多任务处理,需要等待进行处理,处理效率较低
  • HandlerThread与线程池不同,HandlerThread是一个串行队列,背后只有一个线程

IntentService面试题


1、IntentService是什么

IntentService是继承自Service并处理异步请求的一个类,其内部采用HandlerThread和Handler实现的,在IntentService内有一个工作线程来处理耗时操作,其优先级比普通Service高。当任务完成后,IntentService会自动停止,而不需要手动调用stopSelf()。另外,可以多次启动IntentService,每个耗时操作都会以工作队列的方式在IntentService中onHandlerIntent()回调方法中执行,并且每次只会执行一个工作线程

2、IntentService使用方法

  • 创建Service继承自IntentService
  • 覆写构造方法和onHandlerIntent()方法
  • 在onHandlerIntent()中执行耗时操作

视图工作机制面试题


事件分发机制面试题


Android项目构建面试题


1、Android构建流程

[图片上传失败…(image-ccd96b-1606878198554)]

2、jenkins持续集成构建

3、git常用命令

  • git init:仓库的初始化
  • git status:查看当前仓库的状态
  • git diff:查看仓库与上次修改的内容
  • git add:将文件放进暂存区
  • git commit:提交代码
  • git clone:克隆代码
  • git bransh:查看当前分支
  • git checkout:切换当前分支

4、git工作流

  • fork/clone(主流)
  • fork:将别人的仓库代码fork到自己的仓库上
  • clone:克隆下自己仓库的代码
  • update、commit:修改代码并提交到自己的仓库
  • push:提交到自己的仓库
  • pull request:请求添加到别人的仓库
  • clone

5、proguard是什么

ProGuard工具是用于压缩、优化和混淆我们的代码,其主作用是移除或混淆代码中无用类、字段、方法和属性

6、proguard技术功能

  • 压缩
  • 优化
  • 混淆
  • 预检测

7、proguard工作原理

将无用的字段或方法存入到EntryPoint中,将非EntryPoint的字段和方法进行替换

8、为什么要混淆

由于Java是一门跨平台的解释性语言,其源代码被编译成class字节码来适应其他平台,而class文件包含了Java源代码信息,很容易被反编译

9、annotationProcessor与compileOnly的区别

annotationProcessor与compileOnly都是只编译并不打入apk中

  • annotationProcessor:编译时生成代码,编译完就不需要了
  • compileOnly:有重复的库时,可以剃除重复库,只保留一个库

ANR面试题


1、什么是ANR

Application Not Responding,页面无响应的对话框

2、发生ANR的条件

应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框

  • Activity超过5秒无响应
  • BroadcastReceiver超过10秒无响应
  • Service超过20秒无响应

3、造成ANR的主要原因

主线程被IO操作阻塞

  • Activity的所有生命周期回调都是执行在主线程的
  • Service默认执行在主线程中
  • BoardcastReceiver的回调onReceive()执行在主线程中
  • AsyncTask的回调除了doInBackground,其他都是在主线程中
  • 没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中

4、如何解决ANR

  • 使用AsyncTask处理耗时IO操作
  • 使用Thread或HandlerThread提高优先级
  • 使用Handler处理工作线程的耗时操作
  • Activity的onCreate和onResume回调尽量避免耗时操作

OOM面试题


1、什么是OOM

OOM指Out of memory(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常

2、OOM相关概念

  • 内存溢出:指程序在申请内存时,没有足够的空间供其使用
  • 内存泄漏:指程序分配出去的内存不再使用,无法进行回收
  • 内存抖动:指程序短时间内大量创建对象,然后回收的现象

3、解决OOM

Bitmap相关

  • 图片压缩
  • 加载缩略图
  • 在滚动时不加载图片
  • 回收Bitmap
  • 使用inBitmap属性
  • 捕获异常

其他相关

  • listview重用convertView、使用lru
  • 避免onDraw方法执行对象的创建
  • 谨慎使用多进程

Bitmap面试题


1、recycle

  • 在安卓3.0以前Bitmap是存放在堆中的,我们只要回收堆内存即可
  • 在安卓3.0以后Bitmap是存放在内存中的,我们需要回收native层和Java层的内存
  • 官方建议我们3.0以后使用recycle方法进行回收,该方法也可以不主动调用,因为垃圾回收器会自动收集不可用的Bitmap对象进行回收
  • recycle方法会判断Bitmap在不可用的情况下,将发送指令到垃圾回收器,让其回收native层和Java层的内存,则Bitmap进入dead状态
  • recycle方法是不可逆的,如果再次调用getPixels()等方法,则获取不到想要的结果

2、LruCache原理

LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中

3、计算采样率

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}

4、采样率压缩(缩略图)

public static Bitmap thumbnail(String path,int maxWidth, int maxHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
options.inJustDecodeBounds = false;
int sampleSize = calculateInSampleSize(options, maxWidth, maxHeight);
options.inSampleSize = sampleSize;
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inPurgeable = true;
options.inInputShareable = true;
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
bitmap = BitmapFactory.decodeFile(path, options);
return bitmap;
}

5、质量压缩

public static String save(Bitmap bitmap,Bitmap.CompressFormat format, int quality, File destFile) {
try {
FileOutputStream out = new FileOutputStream(destFile);
if (bitmap.compress(format, quality, out)) {
out.flush();
out.close();
}
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
return destFile.getAbsolutePath();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

6、尺寸压缩

public static void reSize(Bitmap bmp,File file,int ratio){
Bitmap result = Bitmap.createBitmap(bmp.getWidth()/ratio, bmp.getHeight()/ratio,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
RectF rect = new RectF(0, 0, bmp.getWidth()/ratio, bmp.getHeight()/ratio);
canvas.drawBitmap(bmp, null, rect , null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}

7、保存到SD卡

public static String save(Bitmap bitmap,Bitmap.CompressFormat format, int quality, Context context) {
if (!Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)) {
return null;
}
File dir = new File(Environment.getExternalStorageDirectory()

  • “/” + context.getPackageName() + “/save/”);
    if (!dir.exists()) {
    dir.mkdirs();
    }
    File destFile = new File(dir, UUID.randomUUID().toString());
    return save(bitmap, format, quality, destFile);
    }

8、三级缓存

  • 网络缓存
  • 本地缓存
  • 内存缓存

9、NDK压缩

Android进阶——图片优化之质量压缩、尺寸压缩、采样率压缩、LibJpeg压缩

10、webp压缩

Android Webp 完全解析 快来缩小apk的大小吧-鸿洋的博客

UI卡顿面试题


1、UI卡顿原理

View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象

2、UI卡顿的原因分析

  • 在UI线程中做轻微的耗时操作,导致UI线程卡顿
  • 布局Layout过于复杂,无法在16ms内完成渲染
  • 同一时间动画执行的次数过多,导致CPU和GPU负载过重
  • overDraw,导致像素在同一帧的时间内被绘制多次,使CPU和GPU负载过重
  • View频繁的触发measure、layout,导致measure、layout累计耗时过多和整个View频繁的重新渲染
  • 频繁的触发GC操作导致线程暂停,会使得安卓系统在16ms内无法完成绘制
  • 冗余资源及逻辑等导致加载和执行缓慢
  • ANR

3、UI卡顿的优化

  • 布局优化
  • 使用include、ViewStub、merge
  • 不要出现过于嵌套和冗余的布局
  • 使用自定义View取代复杂的View
  • ListView优化
  • 复用convertView
  • 滑动不加载
  • 背景和图片优化
  • 缩略图
  • 图片压缩
  • 避免ANR
  • 不要在UI线程中做耗时操作

内存泄漏面试题


1、Java内存泄漏引起的主要原因

长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏

2、Java内存分配策略

  • 静态存储区:又称方法区,主要存储全局变量和静态变量,在整个程序运行期间都存在
  • 栈区:方法体的局部变量会在栈区创建空间,并在方法执行结束后会自动释放变量的空间和内存
  • 堆区:保存动态产生的数据,如:new出来的对象和数组,在不使用的时候由Java回收器自动回收

3、Android解决内存泄漏的例子

  • 单例造成的内存泄漏:在单例中,使用context.getApplicationContext()作为单例的context
  • 匿名内部类造成的内存泄漏:由于非静态内部类持有匿名外部类的引用,必须将内部类设置为static
  • Handler造成的内存泄漏:使用static的Handler内部类,同时在实现内部类中持有Context的弱引用
  • 避免使用static变量:由于static变量会跟Activity生命周期一致,当Activity退出后台被后台回收时,static变量是不安全,所以也要管理好static变量的生命周期
  • 资源未关闭造成的内存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要关闭
  • AsyncTask造成的内存泄漏:由于非静态内部类持有匿名内部类的引用而造成内存泄漏,可以通过AsyncTask内部持有外部Activity的弱引用同时改为静态内部类或在onDestroy()中执行AsyncTask.cancel()进行修复

内存管理面试题


1、Android内存管理机制

  • 分配机制
  • 管理机制

2、内存管理机制的特点

  • 更少的占用内存
  • 在合适的时候,合理的释放系统资源
  • 在系统内存紧张的时候,能释放掉大部分不重要的资源
  • 能合理的在特殊生命周期中,保存或还原重要数据

3、内存优化方法

  • Service完成任务后应停止它,或用IntentService(因为可以自动停止服务)代替Service
  • 在UI不可见的时候,释放其UI资源
  • 在系统内存紧张的时候,尽可能多的释放非重要资源
  • 避免滥用Bitmap导致内存浪费
  • 避免使用依赖注入框架
  • 使用针对内存优化过的数据容器
  • 使用ZIP对齐的APK
  • 使用多进程

冷启动和热启动面试题


1、什么是冷启动和热启动

  • 冷启动:在启动应用前,系统中没有该应用的任何进程信息
  • 热启动:在启动应用时,在已有的进程上启动应用(用户使用返回键退出应用,然后马上又重新启动应用)

2、冷启动和热启动的区别

  • 冷启动:创建Application后再创建和初始化MainActivity
  • 热启动:创建和初始化MainActivity即可

3、冷启动时间的计算

这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制为止

4、冷启动流程

  • Zygote进程中fork创建出一个新的进程
  • 创建和初始化Application类、创建MainActivity
  • inflate布局、当onCreate/onStart/onResume方法都走完
  • contentView的measure/layout/draw显示在界面上

总结:点击App->IPC->Process.start->ActivityThread->Application生命周期->Activity生命周期->ViewRootImpl测量布局绘制显示在界面上

5、冷启动优化

  • 减少第一个界面onCreate()方法的工作量
  • 不要让Application参与业务的操作
  • 不要在Application进行耗时操作
  • 不要以静态变量的方式在Application中保存数据
  • 减少布局的复杂性和深度
  • 不要在mainThread中加载资源
  • 通过懒加载方式初始化第三方SDK

6、adb命令获取启动时间

adb shell am start -W packagename/MainActivity

  • ThisTime:最后一个Activity启动耗时
  • TotalTime:所有Activity启动耗时
  • WaitTime:AMS启动Activity的总耗时

其他优化面试题


1、Android不用静态变量存储数据

  • 静态变量等数据由于进程已经被杀死而被初始化
  • 使用其他数据传输方式:文件/sp/contentProvider

2、SharePreference安全问题

  • 不能跨进程同步
  • 文件不宜过大

3、内存对象序列化

  • Serializeble:是java的序列化方式,Serializeble在序列化的时候会产生大量的临时对象,从而引起频繁的GC
  • Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要将数据存储在硬盘上的情况

4、避免在UI线程中做繁重的操作

架构模式面试题


插件化面试题


1、插件化解决的问题

  • 动态加载APK(反射、类加载器)
  • 资源加载(反射、AssetManager、独立资源、分段资源)
  • 代码加载(反射获取生命周期)

2、类加载器(Java中字节码添加到虚拟机中)

  • DexClassLoader:能够加载未安装的jar/apk/dex,主要用于动态加载和代码热更新
  • PathClassLoader:加载/data/app目录下的apk文件,只要用来加载系统中已经安装过的apk

热更新面试题


1、热更新主要流程

  • 线上检查到Crash
  • 拉出Bugfix分支修复Crash问题
  • jenkins构建和补丁生成
  • app通过推送或主动拉取补丁文件
  • 将Bugfix代码合到master上

2、热更新主流框架

  • Dexposed
  • AndFix
  • Nuwa

3、热更新的原理

  • 在ClassLoader创建一个dexElements数组
  • 将修复好的dex文件存放在dexElements数组的最前面
  • ClassLoader会遍历dexElements数组,找到最前面的dex文件优先加载

进程保活面试题


1、进程的优先级

  • 空进程
  • 后台进程
  • 服务进程
  • 可见进程
  • 前台进程

2、Android进程回收策略

  • Low memory Killer(定时执行):通过一些比较复杂的评分机制,对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存
  • OOM_ODJ:判别进程的优先级

3、Android保活方案

  • 利用系统广播拉活
  • 利用系统Service机制拉活
  • 利用Native进程拉活
  • 利用JobScheduler机制拉活
  • 利用账号同步机制拉活

Lint面试题


1、什么是Android Lint

Android Lint是一个静态代码分析工具,它能够对你的Android项目中潜在的Bug、可优化的代码、安全性、性能、可用性、可访问性、国际化等进行检查

2、Lint工作流程

[图片上传失败…(image-d5f5ab-1606878198551)]

3、配置Lint

  • 创建Lint.xml到根目录下,自定义Lint安全等级等
  • 在Java文件中可以使用@suppressLint(“NewApi”)来忽视Lint的报错
  • 在xml文件中可以使用tool:ignore(“UnusedResources”)来忽视Lint的报错
  • 自定义Lint检查,可以创建类,继承Detector和实现JavaPsiScanner

Kotlin面试题


1、什么是Kotlin

  • Kotlin是一种基于JVM的编程语言
  • 对Java的一种拓展,比Java更简洁
  • Kotlin支持函数式编程
  • Kotlin类和Java类可以相互调用

2、Kotlin环境搭建

  • 直接在Plugin中下载Kotlin插件即可
  • 系统会自动配置到Kotlin环境

虚拟机面试题


1、Dalvik与JIT

Dalvik是Android虚拟机,JIT则是Dalvik采用的技术策略

在编译打包APK文件时,会经过以下流程Java->Class->Dalvik字节码(dex)->每次执行代码都要编译成机器码->交给底层处理,这样处理起来效率低下,通过引入JIT(即时编译技术),当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行即时编译,经过编译后的代码,会被优化成相当精简的原生型指令码,这样在下次执行到相同逻辑的时候,速度就会更快。但由于每次启动App都需要即时编译,导致运行时耗电量大

2、ART与AOT

ART是Android虚拟机,AOT则是ART采用的技术策略

在ART环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用,这一技术称为AOT。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。但由于会预先编译,安装时间难免会延长,而且会消耗更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%

3、发展史

  • 2.2 ~ 4.4:Dalvik虚拟机使用JIT技术
  • 4.4 ~ 5.0:Dalvik虚拟机和ART虚拟机共存
  • 5.0 ~ x.0:ART虚拟机使用AOT技术替代Dalvik虚拟机

4、JVM与Dalvik不同

  • 类加载系统区别比较大
  • JVM是基于栈,Dalvik是基于寄存器
  • JVM执行的是java字节码文件,Dalvik执行的是dex字节码文件
  • Dalvik可以同时存在多个,即使一个退出了也不会影响其他程序

5、Dalvik与ART不同

  • Dalvik使用JIT(Just In Time 运行时编译)来将字节码转换成机器码,效率低
  • ART采用AOT(Ahead Of Time 运行前编译或安装时编译)预编译技术,应用运行速度更快
  • ART会占用更多的应用安装时间和存储空间

注解面试题


1、什么是Annotation

Java提供的一种元程序中的元素关联任何信息和任何元数据(metadata)的途径和方法

2、什么是metadata

  1. 元数据以标签的形式存在于Java代码中
  2. 元数据描述的信息是类型安全的
  3. 元数据需要编译器之外的工具额外的处理用来生成其他的程序部件
  4. 元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部

3、注解分类

  1. 系统内置标准注解
  • @Override:表示重写
  • @Deprecated:表示已过时
  • @SuppressWarnnings:表示抑制警告
  1. 元注解
  • @Target:表示注解的修饰范围
  • @Retention:表示注解的代码生存期
  • @Documented:表示注解为程序员的API
  • @Inherited:表示注解可以继承
  1. @Target
  • ElementType.CONSTRUCTOR:构造器声明
  • ElementType.FIELD:成员变量、对象、属性(包括enum实例)
  • ElementType.LOCAL_VARIABLE:局部变量声明
  • ElementType.METHOD:方法声明
  • ElementType.PACKAGE:包声明
  • ElementType.PARAMETER:参数声明
  • ElementType.TYPE:类、接口(包括注解类型)或enum声明
  1. @Retention
  • RetentionPolicy.SOURCE:在源文件中有效,当Java文件编译成class文件的时候,注解被遗弃
  • RetentionPolicy.CLASS:在class文件中有效,当jvm加载class文件时候被遗弃
  • RetentionPolicy.RUNTIME:在运行时有效,当jvm加载class文件之后,仍然存在
  1. 生命周期
  • RUNTIME > CLASS > SOURCE
  • .java文件 --> .class文件 --> 内存中的字节码

4、注解声明

注解支持填写数组,同时支持多种范围

@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModuleWrapper {}

5、Android Support Annotation

  • Nullness注解(@NonNull、@Nullable):表示指定的空类型或非空类型
  • ResourceType注解(@StringRes、@IntegerRes、@ColorRes等):表示指定的变量类型
  • Threading注解(@WorkerThread、@UIThread、@MainThread等):表示指定的线程类型
  • Range注解(@IntRange、@FloatRange等):表示允许传值的范围
  • OverridingMethods注解(@CallSuper等):表示调用父类的方法

6、注解的用途

  • 约束类
  • 约束变量

最后

**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

l、@Nullable):表示指定的空类型或非空类型

  • ResourceType注解(@StringRes、@IntegerRes、@ColorRes等):表示指定的变量类型
  • Threading注解(@WorkerThread、@UIThread、@MainThread等):表示指定的线程类型
  • Range注解(@IntRange、@FloatRange等):表示允许传值的范围
  • OverridingMethods注解(@CallSuper等):表示调用父类的方法

6、注解的用途

  • 约束类
  • 约束变量

最后

**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。


[外链图片转存中…(img-Ed28eseg-1713597281449)]

[外链图片转存中…(img-UOjjvwIr-1713597281450)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-8x5MMFJb-1713597281450)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值