金九银十,2024-Android精选面试实战总结整理(含详细解析)(1)

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

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

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

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

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

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

正文

区别:梆梆安全,360加固看不到项目中的类,爱加密看的到Java类,单看不到里面的方法实现体,效果比前面差一点点

加固的底层原理:第三方加固的应用会生成一个Apk,然后把你的APK读取出来,在封装到这个第三方应用的APK里面.

####如何对APK瘦身?

  • 使用混淆,
  • 开启shrinkResourse(shrink-收缩),会将没有用到的图片变成一个像素点
  • 删除无用的语言资源(删除国际化文件)
  • 对于非透明的大图,使用JPG(没有透明度信息),代替PNG格式
  • 使用tinypng进行图片压缩
  • 使用webp图片格式,进一步压缩图片资源
  • 使用第三方包时把用到的代码加到项目中来,避免引用整一个第三方库

####简述多渠道打包及原理和常用操作?

针对每一个渠道(应用市场)都生成一个带有渠道标识的apk文件

原理:用户下载启动应用,获取渠道标识,和设备的唯一标识,并上传到服务器里面,服务器这里就 会根据获取的记录,根据渠道号然后判断是否存在该服务器的表里面。(打标记,取标记,上传标记)

1)友盟多渠道打包:在清单文件中定义一个占位符,在gradle脚本中替换占位符(会使用到Python)

2)美团打包,在meta-data中创建一个空的文件,以文件名标识渠道,做一个解压与压缩的操作,速度会比较快

3)新一代多渠道打包,将渠道标识添加到.apk文件的末尾,并不会对源文件损坏

####Android下的数据存储方式有那些?

  • 内部存储,直接存储在内部文件中
  • 外部存储,首先要判断外部存储条件是否可用,然后进行存储
  • SP存储,底层是Xml实现的,以键值对形式存储内部的数据,适宜于轻量级的存储,存储的数据类型有,boolean,String,int
  • 数据库存储,SQlite存储,轻量级的数据库,强大的增删改查功能
  • 内容提供者,ContentProvider,将自己愿意暴露的一部分数据供外部使用操作
  • 网络存储,等等

####Sharepreference 线程安全问题?

官方文档明确指出,SharedPreferences不支持多线程,进程也是不安全的

如果想要实现线程安全需重新实现其接口,如下

假设在多进程访问SharePreferences的情况下,该如何保证进程安全和共享数据?

解决办法就是:将需要共享数据的字段提出来统一存储到一个文件中。

####Android开发下如何有效进行屏幕适配?

  • 机型适配,去一些统计网站诸如友盟,现在叫友盟+去看一下市场上最流行的Android机型,有针对性的切图
  • 屏幕适配,适配主流xhdpi屏幕尺寸,使用relativelayout,linerlayout等布局,多使用matchparent,wrapcontent,及配合weight,权重处理,
  • 还有就是在代码中,设计到具体尺寸的要使用dp2px的转换,
  • 图片使用可拉伸.9图片,imageview使用scaletype缩放;
  • 使用权重,等比例,百分比布局等等

对象序列化:

####为什么要序列化?

1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。

在Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。两种实现方式依旧是贴url,方便大家快速查询

两种序列化相关

既然Google推荐Parcelable这种序列化,在这里,推荐一键生成序列化的插件,

在Android Studio里面搜索插件,如下图,写起序列化(根本不用你写)那就是一个美滋滋呐~

OkHttp相关?

OkHttp支持同步和异步数据请求,但异步请求是在子线程 (因为原生OkHttp的使用时回调方法是在子线程进行的,要刷新界面还需要用Handler作处理,可以使用第三方的okhttp-utils,Okgo等等);

OkHttp里面封装了线程池、数据转换、GZIP压缩(减少流量的传输)、HTTP协议缓存等,

OKHttp优点—-使用GZip压缩减少传输的数据量,缓存(减少重复请求);

失败重试(如果你的服务有多个IP地址,如果第一次连接失败,OKHttp将使用备用地址)

OKhttp是对http协议的封装,比较底层,因此拓展性强,便于封装;

OKhttp基于NIO(JDK1.5,非阻塞式IO)效率更高

####ButterKnife相关?

简介:

一款快速高效的注入框架,节约开发时间减少代码量(依靠插件动态生成View,点击事件等等)

优点:

1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2.方便的处理Adapter里的ViewHolder绑定问题
3.运行时不会影响APP效率,使用配置方便
4.代码清晰,可读性强

使用经验:

1.Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind

2.Fragment ButterKnife.bind(this, mRootView);

3.属性布局不能用private or static 修饰,否则会报错,(注意权限)

4.setContentView()不能通过注解实现。(其他的有些注解框架可以)

原理:利用注解和反射去获取绑定ViewID,

关于原理详情可参考笔者的这一篇:Android-定制专属ButterKnife框架,该文详细介绍了ButterKnife框架并模仿了一个注解绑定View的框架

####Rxjava概念,常用操作符及拓展?

简介:

一款优雅的异步框架,代替之前的AsyncTask / Handler / XXX / …

其强大的操作符和链式写法,线程切换等有助于提高开发效率和快速定位Bug

与Retrofit搭配使用更是有意想不到的效果,

底层原理:观察者模式

等一些相应的博客

缺点:

1:操作符太多会增加学习成本时间

2:使用不好,容易导致内存泄露(解决方式,推荐Rxlifecycle结合Rxjava,规避内存泄漏风险)

最近面试被怼了?缺面试题刷提升自己吗?

点击:

Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

####ANR相关

ANR全名Application Not Responding, 也就是”应用无响应”. 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框.

在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下两种情况下会弹出ANR对话框:

A) 5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).

B) BroadcastReceiver在10s内无法结束.

造成以上两种情况的首要原因就是在主线程(UI线程)里面做了太多的阻塞耗时操作, 例如文件读写, 数据库读写, 网络查询等等.

####如何分析ANR?

ANR产生时, 系统会生成一个traces.txt的文件放在/data/anr/下. 开发人员可通过adb命令将其导出到本地 ($adb pull data/anr/traces.txt .)通过分析,我们可以根据具体的日志查看Anr原因( 如: 普通阻塞,CPU满负荷,内存泄露 )

####Android中那些场景是执行在主线程的?

1)Activity生命周期回调都是执行在主线程的.
2)Service默认是执行在主线程的.
3)BroadcastReceiver的onReceive回调是执行在主线程的.
4)没有使用子线程的looper的Handler的handleMessage, post(Runnable)是执行在主线程的.
5)AsyncTask的回调中除了doInBackground, 其他都是执行在主线程的.
6)View的post(Runnable)是执行在主线程的.等等

####三级缓存:

当我们第一次打开应用获取图片或其它资源时,首先到网络去下载,然后依次存入内存缓存,磁盘缓存,

当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络上去下载,直接可以从内存缓存和磁盘缓存中找,由于内存缓存速度较快,我们优先到内存缓存中寻找该图片,如果找到则运用,

如果没有找到(内存缓存大小有限),那么我们再到磁盘缓存中去找。

只要我们合理的去协调这三层缓存运用,便可以提升应用性能,给用户更好的体验

三级缓存指的是:内存缓存、本地缓存、网络缓存。其各自的特点是内存缓存速度快, 优先读取,本地缓存速度其次, 内存没有该资源信息就去读取本地内存,网络缓存速度较慢(比较对象是内存缓存和本地缓存),假设本地内存也没有,才请求网络获取。

####内存泄漏:

当应用内部不再需要某个实例后,但是这个对象却仍然被引用,这个情况就叫做内存泄露(Memory Leak)。安卓虚拟机为每一个应用分配一定的内存空间,当内存泄露到达一定的程度就会造成内存溢出。

导致内存泄露常见原因:

1)静态变量直接或者间接地引用了Activity对象就会造成内存泄露

2)Activity使用了静态的View(View会持有Activity的对象的引用)

3)Activity定义了静态View变量???

4)ImageSpan引用了Activity Context

5)单例中引用了Activity的Context(需要使用Application的Context)

6)对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,从而造成内存泄漏。

7)静态集合保存的对象没有及时消除(不使用的时候置为null)

8)在Java中,非静态(匿名)内部类会引用外部类对象,而静态内部类不会引用外部类对象

9)在Activity中,创建了非静态内部类(内部类直接或者间接引用了Activity)的静态成员变量

10)线程包括AsyncTask的使用,Activity退出后线程还在运行(线程在死循环),并且在线程中使用了Activity或view对象(解决方法:不要直接写死循环,可以设置一个布尔类型的TAG,当activity推出的时候,设置TAG为False)

11)Handler对象的使用,Activity退出后Handler还是有消息需要处理(解决方法:在退出activity之后,移除消息)

12)WebView造成的内存泄漏(在onDestory中销毁)

####如何进行内存泄露分析?

A: 通过Android Studio 窗口进行分析,查看内存分配情况,如果操作应用是内存一直往上涨说明存在内存泄露

B: 定位内存泄露分析的工具—-MAT(Memory Analyzer tool)

C: 使用开源库LeakCanary快速定位内存泄露

####Android中的四大组件相关?

Activity:

Activity是一个应用程序组件,提供一个屏幕(狭义的理解就是当前APP的界面),用户可以用来交互为了完成某项任务。(点击,登录,跳转页面)

Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件(设置布局文件)。

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

####Activity四种启动模式?

Activity的启动模式指,可以根据实际开发需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。

1)standard

standard为Activity的默认启动模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。(点back键会依照栈顺序依次退出)

2)singleTop

singleTop模式下,Activity可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。

3)singleTask

singleTask表示只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

4)singleInstance

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

5)BraodcastReceiver:(待补充)

使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。

最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。

一起互勉~

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

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

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

-1713368410090)]

一起互勉~

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值