2024Android面试题(1),15个经典面试问题及答案

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

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

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

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

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

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

正文

onStart() 由不可见变为可见

onResume() 可以与用户进行交互,位于栈顶

onPause() 暂停,启动或恢复另一个活动时调用

onStop() 停止,变为不可见

onDestroy() 销毁

onRestart() 由停止状态变为运行状态

2.Fragment生命周期 (这个有可能会问到,问的机率不是很大)

3.Service生命周期

onCreate()

首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次。

onStartCommand()

当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。

onDestroy()

当服务不再使用且将被销毁时,系统将调用此方法。

onBind()

当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法。

onUnbind()

当另一个组件通过调用unbindService()与服务解绑时,系统将调用此方法。

onRebind()

当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。

4.Service启动方式(问到Service,这个肯定是要问到的)

1.startService

①.定义一个类继承service

②.在manifest.xml文件中配置该service

③.使用context的startService(intent)启动该service

④.不再使用时,调用stopService(Intent)停止该服务

2.bindService

①.创建bindService服务段,继承自service并在类中,创建一个实现binder接口的实例对象并提供公共方法给客户端调用

②.从onbind()回调方法返回此binder实例

③.在客户端中,从onserviceconnected()回调方法接收binder,并使用提供的方法调用绑定服务

5.Activity的启动方式(偶尔会问)

①.standard模式

a.Activity的默认启动模式

b.每启动一个Activity就会在栈顶创建一个新的实例。例如:闹钟程序

缺点:当Activity已经位于栈顶时,而再次启动Activity时还需要在创建一个新的实例,不能直接复用。

②.singleTop模式

特点:该模式会判断要启动的Activity实例是否位于栈顶,如果位于栈顶直接复用,否则创建新的实例。 例如:浏览器的书签

缺点:如果Activity并未处于栈顶位置,则可能还会创建多个实例。

③.singleTask模式

特点:使Activity在整个应用程序中只有一个实例。每次启动Activity时系统首先检查栈中是否存在当前Activity实例,如果存在

则直接复用,并把当前Activity之上所有实例全部出栈。例如:浏览器主界面

④.singleInstance模式

特点:该模式的Activity会启动一个新的任务栈来管理Activity实例,并且该势力在整个系统中只有一个。无论从那个任务栈中启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity

6.Touch事件传递机制

在我们点击屏幕时,会有下列事件发生:

Activity调用dispathTouchEvent()方法,把事件传递给Window;

Window再将事件交给DecorView(DecorView是View的根布局);

DecorView再传递给ViewGroup;

Activity ——> Window ——> DecorView ——> ViewGroup——> View

事件分发的主要有三个关键方法

dispatchTouchEvent() 分发

onInterceptTouchEvent() 拦截 ,只有ViewGroup独有此方法

onTouchEvent() 处理触摸事件

Activity首先调用dispathTouchEvent()进行分发,接着调用super向下传递

ViewGroup首先调用dispathTouchEvent()进行分发,接着会调用onInterceptTouchEvent()(拦截事件)。若拦截事件返回为true,表示拦截,事件不会向下层的ViewGroup或者View传递;false,表示不拦截,继续分发事件。默认是false,需要提醒一下,View是没有onInterceptTouchEvent()方法的

事件在ViewGroup和ViewGroup、ViewGroup和View之间进行传递,最终到达View;

View调用dispathTouchEvent()方法,然后在OnTouchEvent()进行处理事件;OnTouchEvent() 返回true,表示消耗此事件,不再向下传递;返回false,表示不消耗事件,交回上层处理。

7.介绍下实现一个自定义View的基本流程

①.自定义View的属性 编写attr.xml文件

②.在layout布局文件中引用,同时引用命名空间

③.在View的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到attr.xml文件值)

④.重写onMesure

⑥.重写onDraw

8.Android中的动画有哪些

逐帧动画(Frame Animation)

加载一系列Drawable资源来创建动画,简单来说就是播放一系列的图片来实现动画效果,可以自定义每张图片的持续时间

补间动画(Tween Animation)

Tween可以对View对象实现一系列动画效果,比如平移,缩放,旋转,透明度等。但是它并不会改变View属性的值,只是改变了View的绘制的位置,比如,一个按钮在动画过后,不在原来的位置,但是触发点击事件的仍然是原来的坐标。

属性动画(Property Animation)

动画的对象除了传统的View对象,还可以是Object对象,动画结束后,Object对象的属性值被实实在在的改变了

9.ANR是什么?怎样避免和解决ANR

Application Not Responding,即应用无响应

出现的原因有三种:

a)KeyDispatchTimeout(5 seconds)主要类型按键或触摸事件在特定时间内无响应

b)BroadcastTimeout(10 seconds)BoradcastReceiver在特定的时间内无法处理

c)ServiceTimeout(20 seconds)小概率类型Service在特定的时间内无法处理完成

避免ANR最核心的一点就是在主线程减少耗时操作。通常需要从那个以下几个方案下手:

a)使用子线程处理耗时IO操作

b)降低子线程优先级,使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同

c)使用Handler处理子线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程

d)Activity的onCreate和onResume回调中尽量避免耗时的代码

e)BroadcastReceiver中onReceiver代码也要尽量减少耗时操作,建议使用intentService处理。intentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题

10.如何优化ListView(偶尔会问)

①Item布局,层级越少越好,使用hierarchyview工具查看优化。

②复用convertView

③使用ViewHolder

④item中有图片时,异步加载

⑤快速滑动时,不加载图片

⑥item中有图片时,应对图片进行适当压缩

⑦实现数据的分页加载

11.设备横竖屏切换的时候,生面周期的变化(这个偶尔会问)

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

12.AndroidUI的适配

字体使用sp,使用dp,多使用match_parent,wrap_content,weight

图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。

13.RecyclerView和ListView的区别(这个是必问的)

RecyclerView可以完成ListView,GridView的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平);

RecyclerView中view的复用不需要开发者自己写代码,系统已经帮封装完成了。

RecyclerView可以进行局部刷新。

RecyclerView提供了API来实现item的动画效果。

在性能上:

如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。

如果只是作为列表展示,则两者区别并不是很大。

14,Android异步消息处理机制(这个也会经常问到)

异步消息处理机制主要是用来解决子线程更新UI的问题

主要有四个部分:

①. Message (消息)中

在线程之间传递,可在内部携带少量信息,用于不同线程之间交换数据

可以使用what、arg1、arg2字段携带整型数据

obj字段携带Object对象

②. Handler (处理者)

主要用于发送和处理消息,sendMessage()用来发送消息,最终会回到handleMessage()进行处理

③. MessageQueue (消息队列)

主要存放所有通过Handler发送的消息,它们会一直存在于队列中等待被处理

每个线程只有一个MessageQueue

④. Looper (循环器)

调用loop()方法后,会不断从MessageQueue 取出待处理的消息,然后传递到handleMessage进行处理

15.内存泄漏和内存溢出是什么?一般怎么处理内存泄漏?

(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。

(2)引起内存泄露的原因

(3)内存泄露检测工具 ——→LeakCanary

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出通俗的讲就是内存不够用。

内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档

喜欢的朋友可以关注、转发、点赞 感谢!

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

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

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

图片转存中…(img-GrsbwfoI-1713415345920)]

喜欢的朋友可以关注、转发、点赞 感谢!

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

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

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到Android面试题时,高级级别的问题通常会涉及更深入的主题和技术。以下是一些可能的高级Android面试题及其答案: 1. 请解释一下Android中的四大组件。 答:Android中的四大组件是Activity、Service、BroadcastReceiver和ContentProvider。Activity用于用户界面的展示和交互,Service用于在后台执行长时间运行的任务,BroadcastReceiver用于接收和处理系统广播消息,ContentProvider用于数据共享和访问。 2. 请解释一下Android中的MVC、MVP和MVVM架构模式。 答:MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为模型(数据)、视图(用户界面)和控制器(逻辑处理)三个部分。MVP(Model-View-Presenter)是MVC的变体,将控制器替换为Presenter,使视图和模型之间的耦合更低。MVVM(Model-View-ViewModel)是一种新的架构模式,通过数据绑定实现视图和模型之间的通信。 3. 请解释一下Android中的内存泄漏以及如何避免。 答:内存泄漏是指应用程序中未使用的内存无法被垃圾回收器回收,导致内存占用不断增加。在Android中,常见的内存泄漏原因包括静态引用、匿名内部类、Handler引起的内存泄漏等。避免内存泄漏的方法包括及时释放资源、避免使用静态引用、避免匿名内部类等。 4. 请解释一下Android中的线程和线程间通信方式。 答:在Android中,可以使用Thread类或者HandlerThread类创建线程。线程间通信的方式包括使用Handler进行消息传递、使用AsyncTask进行异步任务处理、使用BroadcastReceiver进行广播消息传递等。 5. 请解释一下Android中的性能优化技巧。 答:Android性能优化的技巧包括减少内存使用、优化布局和绘制、使用合适的数据结构和算法、避免频繁的IO操作、使用缓存等。此外,还可以使用工具如Lint、TraceView和HierarchyViewer进行性能分析和调优。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值